Signal 协议 的 java接口库
概述
Signal协议是一种基于双棘轮技术的前向保密协议。可应用于在同步和异步这两种消息传递环境。
接口库开源地址:https://github.com/signalapp/libsignal-protocol-java
预共享密钥
Signal协议中应用了预共享密钥(PreKey)概念。预共享密钥包括一个公钥和一个对应的惟一ID。
准备数据时,客户端生成一个已签名的预共享密钥,以及一组未签名的预共享密钥的列表,并将它们全部传输到服务器上存储,以供查询。预共享密钥也可以签名。
会话
Signal协议是面向会话的。客户端建立一个“会话”,用于后续的加密/解密操作。一旦建立了一个会话,通信过程中就不必再拆掉它。
会话可以通过以下三种方式建立:
- 基于预共享密钥包(PreKeyBundles):预向某收件人发送消息的客户端,可以通过从服务器上检索该收件人的预共享密钥包来建立会话。
- 预共享密钥消息(PreKeySignalMessages):客户端可以从收件人接收预共享密钥消息并使用它建立会话。
- 密钥交换消息(KeyExchangeMessages):两个客户端可以交换密钥交换消息以建立会话。
状态
已建立的会话封装了两个客户端之间的许多状态。这些状态与会话同生命周期,保存在记录中:
- 身份信息状态:客户端需要维护自己的身份密钥对以及从其他客户端接收的身份密钥的状态;
- 预共享密钥状态:客户端需要维护生成的预共享密钥的状态;
- 已签名预共享密钥状态:客户端需要维护其已签名预密钥的状态;
- 会话状态:客户端需要维护其已建立会话的状态。
接口库使用
准备数据
准备数据时,libsignal客户端需要生成其身份认证密钥、注册id和预共享密钥。以下代码是以bob端为例:
// 构建bob的数据内容 int bobId = 0x10203040; // bob 的地址 SignalProtocolAddress bobAddress = new SignalProtocolAddress("BobName", bobId); // IKP-B,身份认证密钥对 IdentityKeyPair bobIdentityKeyPair = KeyHelper.generateIdentityKeyPair(); // 注册编号, int bobRegistrationId = KeyHelper.generateRegistrationId(false); // 预共享密钥 List<PreKeyRecord> bobPreKeys = KeyHelper.generatePreKeys(bobId, 100); // 已签名预共享密钥SPK-B ID int bobSignedPreKeyId = 1; // 已签名预共享密钥 SignedPreKeyRecord bobSignedPreKey = KeyHelper.generateSignedPreKey(bobIdentityKeyPair, bobSignedPreKeyId); // 获取到的,bob的某一个预共享的密钥包 // 一次性预共享密钥OPK-B ID int bobPreKeyId = 1; // 一次性预共享密钥OPK-B公钥 ECPublicKey bobPreKeyPublic = bobPreKeys.get(bobPreKeyId).getKeyPair().getPublicKey(); // 已签名预共享密钥SPK-B公钥 ECPublicKey bobSignedPreKeyPublic = bobSignedPreKey.getKeyPair().getPublicKey(); // 预共享密钥签名Sig(IK-B,Encode(SPK-B)) byte[] bobSignedPreKeySignature = Curve.calculateSignature(bobIdentityKeyPair.getPrivateKey(), bobSignedPreKeyPublic.serialize()); // 身份认证公钥IK-B IdentityKey bobIdentityKey = bobIdentityKeyPair.getPublicKey(); // 组建预共享密钥包 PreKeyBundle bobProKeyBundle = new PreKeyBundle(bobRegistrationId, bobRegistrationId, bobPreKeyId,bobPreKeyPublic, bobSignedPreKeyId, bobSignedPreKeyPublic, bobSignedPreKeySignature, bobIdentityKey); //发送预共享密钥包到服务器...
建立会话
应用接口库的客户端需要实现四个接口:IdentityKeyStore、PreKeyStore、SignedPreKeyStore和SessionStore。它们将用于管理身份认证密钥、预共享密钥、已签名预共享密钥和会话状态的加载和存储。
通过这些构建会话就相当简单:
// IKP-A,身份认证密钥对 IdentityKeyPair aliceIdentityKeyPair = KeyHelper.generateIdentityKeyPair(); // 注册编号, int aliceRegistrationId = KeyHelper.generateRegistrationId(false); // 会话存储 SessionStore aliceSessionStore = new InMemorySessionStore(); // 预共享存储 PreKeyStore alicePreKeyStore = new InMemoryPreKeyStore(); // 已签名预共享密钥 SignedPreKeyStore aliceSignedPreKeyStore = new InMemorySignedPreKeyStore(); // 身份认证密钥对 IdentityKeyStore aliceIdentityStore = new InMemoryIdentityKeyStore(aliceIdentityKeyPair, aliceRegistrationId); // 创建会话处理器 SessionBuilder aliceSessionBuilder = new SessionBuilder(aliceSessionStore, alicePreKeyStore, aliceSignedPreKeyStore, aliceIdentityStore, bobAddress); // 从服务器获取bob的预共享密钥包,初始化会话 aliceSessionBuilder.process(bobProKeyBundle); //创建消息加解密器 SessionCipher sessionCipher = new SessionCipher(aliceSessionStore, alicePreKeyStore, aliceSignedPreKeyStore,aliceIdentityStore, bobAddress); // 组建初始消息 CiphertextMessage message = sessionCipher.encrypt("Hello world!".getBytes("UTF-8")); //将消息内容发送到bob...
bob端收到后可通过PreKeySignalMessage的方式初始化会话。
//SessionBuilder以及各种store的创建,类似alice端 bobSessionBuilder.process(sessionRecord ,(PreKeySignalMessage) message);
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深度剖析 Kafka/RocketMQ 顺序消息的一些坑
我不记得有多少人问过以下这个问题了: 我觉得这个问题问得很频繁,而且非常经典,在这里我就以 Kafka 为例子,说说我对 Kafka 顺序消息的一些理解吧,如有理解不对的地方麻烦留言指点一下。 通常我们在说顺序消费指的是生产者按照顺序发送,消费者按照顺序进行消费,听起来简单,但做起来却非常困难。 我们都知道无论是 Kafka 还是 RocketMQ,每个主题下面都有若干分区(RocketMQ 叫队列),如果消息被分配到不同的分区中,那么 Kafka 是不能保证消息的消费顺序的,因为每个分区都分配到一个消费者,此时无法保证消费者的消费先后,因此如果需要进行消息具有消费顺序性,可以在生产端指定这一类消息的 key,这类消息都用相同的 key 进行消息发送,kafka 就会根据 key 哈希取模选取其中一个分区进行存储,由于一个分区只能由一个消费者进行监听消费,因此这时候消息就具有消息消费的顺序性了。 生产端 但以上情况只是在正常情况下可以保证顺序消息,但发生故障后,就没办法保证消息的顺序了,我总结以下两点: 1、当生产端是异步发送时,此时有消息发送失败,比如你异步发送了 1,2,3 消息,...
- 下一篇
阿里云 MaxCompute 2020-4 月刊
导读 【4月新功能】 【4月新文档】 【新增解决方案】 【新增最佳实践】 【4月新功能】 1. MaxCompute管家新版发布 更完善的CU资源使用监控、支持历史作业查看、支持批量作业操作。 适用客户MaxCompute公共云客户 版本/规格功能 增强CU资源的监控管理能力:增加了CU监控指标、支持更灵活的资源组搜索; 提升作业查看的易用性:支持运行时和历史作业查看、支持作业与DataWorks节点ID关联; 更方便的作业管理操作:支持批量终止作业、支持查看近7天的历史作业操作记录。 查看文档 >>2. MaxCompute 支持对按量付费单个SQL作业的消费进行控制 MaxCompute支持按量付费的作业消费控制功能,以免在您的计算消费超出预期。 适用客户MaxCompute公共云客户 发布功能通过flag设置单个SQL作业的消费金额上限,每次执行SQL之前会先做cost sql的操作,检查费用预估是否超出阈值,如果超过,就会cancle掉这个作业,避免费用损失。 查看文档 >>3. Policy支持 Grant 方式授权 MaxCompute 权限功能升...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- 设置Eclipse缩进为4个空格,增强代码规范