2个键盘
2key-ratchet 执行 双键 礼宾和 X3DH 密码 使用 WebCrypto 键入脚本.
设计双层雷管协议和X3DH的目的是既提供前向保密又提供密码解密。 重要的是,有一些独立的 安保审查 最后,他们完成了这些目标.
“双重Ratchet”一词来源于协议如何确保每个消息都得到一个新的密钥: Diffie-Hellman 键被“切开” 以每个新信件交换方式进行; 发送/接收链条也是如此 “对称-钥匙鼠标”) (中文(简体) ).
有几个 差异 原规格与 2key-ratchet最重要的是,正如它的名字所示,它使用 二键,一个用于认证,另一个用于密钥交换。 另一个大个是使用secp256r1代替了曲线25519,因为浏览器尚未在本土支持这个曲线.
见 智利 文档以更好地了解库结构.
对于你可能使用的地方的想法 2key-ratchet 见 萨尔瓦多 文档.
关于许可证发放信息,见 自由主义 文档.
概览
身份钥匙
协议中的每个对等方都有 IdentityKey,这些是 sepp256r1 键。 这些密钥用来验证两者 PreKeys 财务报告和审定财务报表 ExchangeKeys。 。 。 . IdentityKeys 在X.509证书中与公用钥匙类似.
交换键
交换钥匙由 2key-ratchet,用来获取 PreKeys编辑 ExchangeKey 由同行签名 IdentityKey。 。 。 .
预键
单位 2key-ratchet a PreKey是一个有相关独特标识的secp256r1公钥. 这些 PreKeys 由 IdentityKey。 。 。 .
在第一次使用时,客户端生成一个签名的PreKey,以及大量未签名的PreKeys列表,并将其全部传送给服务器.
服务器
协议中的服务器是一个不值得信赖的实体,它只是存储预键进行检索,当对等点可能离线和无法到达时.
会议
双射纹协议面向会话. 同伴建立一个 session 互相交流,然后用于随后的所有交流。 这些会话可以保持开放并被重新使用,因为每条消息都用新的和独特的加密密钥加密.
大小和附属关系
| 名称 | 大小 | 说明 |
|---|---|---|
| 2key-ratchet.js (英语) | 66个Kb | 没有外部模块的 UMD 模块 |
注: 您还必须导入 tslib 语录 财务报告和审定财务报表 原生生物库 用于浏览器.
说明
安装
npm install 2key-ratchet
使用量
包含 2key-ratchet 及其申请中的依赖性.
诺德杰斯:
let DKeyRatchet = require("2key-ratchet");
布鲁斯:
<script src="2key-ratchet.js"></script>
这个 DKeyRatchet 命名空间将永远在全球提供,并支持AMD加载器.
生成身份密钥
第一步是创建"身份钥匙".
let AliceID;
DKeyRatchet.Identity.create(16453, 1, 1)
.then((id) => {
AliceID = id;
});
然后创建您的 PreKey 信件捆绑 :
let bundle = new DKeyRatchet.PreKeyBundleProtocol();
bundle.identity.fill(AliceID)
.then(() => {
bundle.registrationId = AliceID.id;
const preKey = AliceID.signedPreKeys[0];
bundle.preKeySigned.id = 1;
bundle.preKeySigned.key = preKey.publicKey;
return bundle.preKeySigned.sign(AliceID.signingKey.privateKey);
})
.then(() => {
return bundle.exportProto();
})
.then((ab) => {
console.log(ab); // ArrayBuffer { byteLength: 374 }
});
然后导入生成的 PreKey 信件捆绑 :
DKeyRatchet.PreKeyBundleProtocol.importProto(ab)
.then((bundle) => {
// check signed prekey
return bundle.preKeySigned.verify(AliceID.signingKey.publicKey);
})
.then((trusted) => {
if (!trusted)
throw new Error("Error: The PreKey is not trusted");
})
创建会话
您现在可以创建一个会话:
注:数据转换使用了模块
pvtsutils。 。 。 .
DKeyRatchet.AsymmetricRatchet.create(BobID, bundle)
.then((cipher) => {
return cipher.encrypt(Convert.FromUtf8String("Hello world!"));
})
.then((preKeyMessage) => {
return preKeyMessage.exportProto();
})
.then((BobMessage) => {
console.log(BobMessage); // ArrayBuffer {byteLength: 408}
});
在另一边你也会这么做:
// Parse received bytes to proto
return DKeyRatchet.PreKeyMessageProtocol.importProto(BobMessage)
.then((proto) => {
return DKeyRatchet.AsymmetricRatchet.create(AliceID, proto)
.then((cipher) => {
return cipher.decrypt(proto.signedMessage);
})
.then((message) => {
console.log(Convert.ToUtf8String(message)); // Hello world!
});
});
我们有一个 完整的示例, 您可以在这里查看。 。 。 .
捐款
如果你发现2键滑板有问题,请打开一出新作. 特色要求也是受欢迎的.
拉出请求 — — 补丁、改进、新功能 — — 是一个了不起的帮助。 在提出任何重大拉动请求(例如执行新功能)之前,请先询问.
说明
布鲁斯·施奈尔(Bruce Schneier)出名地说"如果你认为密码学可以解决你的问题,那么你就不了解你的问题,也不懂密码". 要点是,使用2key-ratchet,或者任何其他"与计算机相关的"库,并不一定会让你的产品安全.
简而言之,制造安全产品比添加加密技术要多得多, 这是一本很棒的书 让你熟悉防御性思维。 。 。 .
警告
虽然这个图书馆是基于 双射纹算法 财务报告和审定财务报表 x3DH 关键协议议定书 多个 变动 可能改变它们提供的安全财产。 此时,你应当认为,在完成进一步的安保审查之前,这一执行是适当的.
鸣谢
Double Ratchet和X3DH都是由特雷弗·佩林和莫克西·马林斯派克设计的,我们感谢他们的工作.
