mgp25 / libsignal-php
这是由Moxie Marlinspike最初编写的libsignal-java的PHP端口。
Requires
- php: >= 5.6
- ext-crypto: *
- ext-curve25519: *
- ext-protobuf: *
Requires (Dev)
- phpunit/phpunit: ~6.1
This package is auto-updated.
Last update: 2022-01-19 17:00:31 UTC
README
这是由libaxolotl-android改编的PHP端口,最初由Moxie Marlinspike编写。
这在Chat API中使用。
原始作者概述
阅读更多详情此处。
概述
这是一个可向前滚动的机密协议,可在同步和异步消息环境中工作。协议概述在此处可用,线格式细节在此处可用。
预密钥
此协议使用名为“预密钥”的概念。预密钥是一个ECPublicKey和一个由服务器存储的唯一ID。预密钥也可以被签名。
在安装时,客户端生成一个已签名的预密钥以及大量未签名的预密钥,并将它们全部传输到服务器。
会话
axolotl协议是面向会话的。客户端建立一个“会话”,然后用于所有后续的加密/解密操作。一旦建立会话,就无需拆毁会话。
会话可以通过以下三种方式之一建立
- 预密钥包。希望向收件人发送消息的客户端可以通过从服务器检索该收件人的预密钥包来建立会话。
- 预密钥消息。客户端可以接收来自收件人的预密钥消息并使用它来建立会话。
- 密钥交换消息。两个客户端可以交换密钥交换消息以建立会话。
状态
建立的会话封装了两个客户端之间的很多状态。该状态在需要维持会话生命周期的持久记录中维护。
状态存储在以下位置
- 身份状态。客户端需要维护自己的身份密钥对的状态,以及从其他客户端接收到的身份密钥。
- 预密钥状态。客户端需要维护其生成的预密钥的状态。
- 已签名的预密钥状态。客户端需要维护其已签名的预密钥的状态。
- 会话状态。客户端需要维护其建立的会话的状态。
安装时间
在安装时,libaxolotl 客户端需要生成其身份密钥、注册 ID 和预密钥。
$axolotl = new KeyHelper(); $identityKeyPair = $axolotl->generateIdentityKeyPair(); $registrationId = $axolotl->generateRegistrationId(); $preKeys = $axolotl->generatePreKeys(startId, 100); $lastResortKey = $axolotl->generateLastResortKey(); $signedPreKey = $axolotl->generateSignedPreKey(identityKeyPair, 5); // Store $identityKeyPair somewhere durable and safe. // Store $registrationId somewhere durable and safe. // Store preKeys in PreKeyStore. // Store signed prekey in SignedPreKeyStore.
建立会话
libaxolotl 客户端需要实现四个接口:IdentityKeyStore、PreKeyStore、SignedPreKeyStore 和 SessionStore。这些接口将负责加载和存储身份、预密钥、签名预密钥和会话状态。
实现这些接口后,建立会话就相对简单了
$sessionStore = new MySessionStore(); $preKeyStore = new MyPreKeyStore(); $signedPreKeyStore = new MySignedPreKeyStore(); $identityStore = new MyIdentityKeyStore(); // Instantiate a SessionBuilder for a remote recipientId + deviceId tuple. $sessionBuilder = new SessionBuilder($sessionStore, $preKeyStore, $signedPreKeyStore, $identityStore, $recipientId, $deviceId); // Build a session with a PreKey retrieved from the server. $sessionBuilder->process($retrievedPreKey); $essionCipher = new SessionCipher($sessionStore, $recipientId, $deviceId); $message = $sessionCipher->encrypt("Hello world!");
法律事宜
密码学通知
本分发包括密码学软件。您目前居住的国家可能对加密软件的进口、拥有、使用和/或重新出口到另一个国家有限制。在使用任何加密软件之前,请检查您所在国家的法律、法规和政策,以确定是否允许进口、拥有或使用加密软件,以及重新出口。有关更多信息,请参阅 http://www.wassenaar.org/。
美国商务部工业和安全局(BIS)已将此软件分类为出口商品控制编号(ECCN)5D002.C.1,该编号包括使用或执行非对称算法的密码功能的信息安全软件。本分发的方式和形式使其符合许可证例外 ENC 技术软件不受限制(TSU)例外(见 BIS 出口管理法规第 740.13 节),适用于目标代码和源代码。
许可证
根据 GPLv3 许可:https://gnu.ac.cn/licenses/gpl-3.0.html