rakshazi/libsignal-php

mgp25/libsignal-php的分支。这是Moxie Marlinspike最初用Java编写的libsignal-java的PHP版本。

dev-master 2020-04-09 09:59 UTC

This package is auto-updated.

Last update: 2024-09-09 19:56:28 UTC


README

axolotl-php

这是由libaxolotl-android移植到PHP的版本,最初由Moxie Marlinspike编写。

它被用于Chat API

原作者概述

这是一个用于同步和异步消息环境的向前安全协议。协议概述可在这里找到,而线格式详情可在这里找到。

查看详细信息这里

概述

这是一个用于同步和异步消息环境的向前安全协议。协议概述可在这里找到,而线格式详情可在这里找到。

预密钥

此协议使用一个名为“预密钥”的概念。预密钥是一个ECPublicKey和一个关联的唯一ID,它们由服务器存储在一起。预密钥也可以签名。

在安装时,客户端生成一个签名的预密钥,以及一个大量未签名的预密钥列表,并将它们全部传输到服务器。

会话

axolotl协议是面向会话的。客户端建立“会话”,然后用于所有后续的加密/解密操作。一旦建立会话,就无需销毁会话。

会话可以通过以下三种方式之一建立

  1. 预密钥包。希望向收件人发送消息的客户端可以通过从服务器检索该收件人的预密钥包来建立会话。
  2. 预密钥Whisper消息。客户端可以接收来自收件人的预密钥Whisper消息,并使用它来建立会话。
  3. 密钥交换消息。两个客户端可以通过交换密钥交换消息来建立会话。

状态

已建立的会话封装了两个客户端之间的大量状态。该状态在持久记录中维护,这些记录需要保持整个会话的生命周期。

状态存储在以下位置

  1. 身份状态。客户端需要维护其自己的身份密钥对以及从其他客户端接收到的身份密钥。
  2. 预密钥状态。客户端需要维护其生成的预密钥的状态。
  3. 已签名的预密钥状态。客户端需要维护其签名的预密钥的状态。
  4. 会话状态。客户端需要维护其已建立的会话的状态。

安装时间

在安装时,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