- 服务器上存储了什么?
设置密码时,将密码转换为字节(不知道使用哪种编码),然后将密码字节用 SHA-512 哈希一次,生成 ed25519 私有的“左半部分”和“右半部分”钥匙。“左半部分”(哈希输出的前 32 个字节)(嗯,字节 0和字节 31)被钳制为有效的曲线 25519 私有标量“a”,并乘以曲线生成器得到组元素“A”, ed25519 公钥。结果值被序列化回 32 字节,然后将该值以 base64 编码(43 字节,没有最后的填充字节“=”)作为用户的散列密码存储。
这个过程完全是确定性的——没有盐。每个具有相同密码的用户都将拥有相同的哈希密码。每次用户将密码改回之前使用过的密码时,密码的哈希值都会被设置为之前使用过的哈希值。有一个单元测试来验证这个事实。代码,单元测试。
- 登录时发送什么?
当客户端想要使用此方案登录时,服务器发送一个 32 字节的随机 nonce,客户端向用户询问密码,生成相同的 ed25519 私钥并执行我相信是正确的使用私钥对 nonce 的 ed25519 签名并将签名发送回服务器。然后服务器执行我相信的正确 ed25519 签名验证。如果签名验证成功,则您已登录。
这对我来说似乎是安全的 - 执行随机 32 字节的 ed25519 签名应该是安全的,并且永远不会泄露私钥本身,并且签名值很长,因此不会重复。
代码:1 2 3 4 5 6
- 没有 TLS 的方案是否安全?
好吧,它不会轻易将您的密码泄露给网络窃听者(尽管使用没有 TLS 的 mysql 会泄露您的所有查询、所有数据,并允许主动攻击者等待您登录,然后接管连接并做任何事情他们想要它)。我不知道这比 login by 好还是坏HMAC(password, random nonce),但我想没关系。
- 它对密码转储的抵抗力如何?
一点也不。由于它是完全确定的,它已经失败了。但是我们可以破解密码哈希吗?CPU 上的 curve25519 scalarmut 约为每秒 75,000 个,但在 2013 年它在 GPU 上约为每秒一百万(来源),因此即使不使用查找表,现代密码破解设备也可以非常快速地破解这些密码(您可以这样做,因为这是确定性的!)。所以它完全不是一个像样的密码哈希。
- 这个方案叫什么名字?
不知道。“直接将密码散列到 ed25519 私钥”?
- 除了 MariaDB 之外,它还被其他任何东西使用吗?
我希望不是。
- 还有其他实现吗?
, C #
- 最后的话?
MariaDB 文档强烈暗示这是安全的,因为它与 openssh 通过 ed25519 密钥进行身份验证所做的完全一样,但显示了使用人工生成密码的示例,而 ssh-keygen 永远不会发生这种情况。仅当人类输入的“密码”是至少 256 位长(64 个十六进制字节,从 2048 个单词的字典中选择的 24 个单词)的统一随机值时,此密码散列方案才是安全的——这意味着计算机生成的密钥,而不是人工生成的密码。这对于人工生成的密码是完全不安全的!