14个版本
0.4.0 | 2023年7月28日 |
---|---|
0.3.1 | 2022年1月23日 |
0.2.0 | 2018年12月20日 |
0.1.1 | 2018年10月16日 |
0.0.3 | 2017年11月29日 |
在 加密学 中排名第2552
每月下载量6,953
用于 26 个crate(5个直接)
46KB
651 行
RustCrypto: SPAKE2
SPAKE2密码认证密钥交换算法的纯Rust实现。
关于
此库实现了SPAKE2密码认证密钥交换("PAKE")算法。这使得两个共享弱密码的当事人可以安全地推导出强共享密钥(从而建立加密+认证的通道)。
被动攻击者(窃听者)在连接中窃听不会获得关于密码或生成的密钥的任何信息。主动攻击者(中间人攻击)对密码有一个猜测的机会,除非他们猜对了,否则他们不会获得关于密码或生成的密钥的任何信息。协议的每次执行都允许一次猜测。通过猜测限制,使用弱密码变得更加安全:网络层攻击者不可用离线字典攻击,并且该协议不依赖于网络预先建立的机密性(例如,在TLS中发送明文密码)。
该协议需要交换一对消息,因此建立会话密钥只需要一次往返。如果需要密钥确认,那将需要第二次往返。
所有消息都是字节数组。对于默认的安全级别(使用Ed25519椭圆曲线,大致相当于128位对称密钥),消息长度为33字节。
此实现是通用的,它定义了要使用的循环群、将群元素和标量转换为字节数组和从字节数组转换到群元素和标量的函数以及用于盲化过程的三个独特的群元素。只有一种这样的Group被实现,命名为Ed25519Group
,它提供快速操作和高安全性,并且与我的python实现兼容。
它是做什么用的?
PAKE可以用于配对协议中,例如Firefox Sync的初始版本(带有J-PAKE的那个版本),将一个设备引入另一个设备并帮助它们共享密钥。在这种模式下,一个设备创建一个随机代码,用户将该代码复制到第二个设备,然后两个设备使用该代码作为一次性密码并运行PAKE协议。一旦两个设备都有一个共享的强密钥,它们就可以安全地交换其他密钥。
PAKE还可以谨慎地用于登录协议,其中SRP可能是最知名的方法。传统的非PAKE登录包括通过TLS加密的通道发送明文密码到服务器,服务器随后对其进行检查(通过散列/拉伸并与存储的验证器比较)。在PAKE登录中,双方将密码放入他们的PAKE协议中,然后确认他们生成的密钥相同。从理论上讲,这不需要初始TLS保护的通道。然而请注意,它需要其他更深入的设计考虑(PAKE协议必须绑定到你最终使用的任何保护通道,否则攻击者可以等待PAKE正常完成然后窃取通道),并且不仅仅是简单的替换。此外,服务器不能对密码进行过多的散列/拉伸(参见下文关于“增强PAKE”的注释),除非客户端愿意在运行PAKE之前执行密钥拉伸,否则服务器的存储验证器将容易受到低成本的字典攻击。
⚠️安全警告
此库从未接受过独立第三方的安全性和正确性审计。
自行承担风险使用!
最低支持的Rust版本
Rust 1.60 或更高版本。
最低支持的Rust版本可能在将来发生变化,但将通过小版本号的增加来完成。
许可证
根据您的选择,许可如下:
。
贡献
除非您明确表示,否则任何有意提交以供包含在您的工作中的贡献,根据Apache-2.0许可证定义,均应按上述方式双许可,而无需任何附加条款或条件。
依赖关系
~1.8–2.7MB
~53K SLoC