MariaDB 的 ed25519 身份验证方案是如何工作的?

信息安全 验证 密码破解 mysql 电子抄送 玛丽亚数据库
2021-09-07 09:04:20

较新版本的 MariaDB(MySQL 数据库服务器分支)有一个新的基于密码的身份验证方案,称为“ed25519”。关于它的工作原理和作用,文档非常稀疏。

https://mariadb.com/kb/en/library/authentication-plugin-ed25519/

数据库中存储的值是什么?它是如何从密码生成的?客户端在登录时向服务器发送的值是多少?它是如何从密码生成的?在没有 TLS 的情况下使用该方案是否安全?它对密码转储的抵抗力如何?这个身份验证方案的正确全名是什么?除了 MariaDB 之外,它还被其他任何东西使用吗?还有其他实现吗?

1个回答
  1. 服务器上存储了什么?

设置密码时,将密码转换为字节(不知道使用哪种编码),然后将密码字节用 SHA-512 哈希一次,生成 ed25519 私有的“左半部分”和“右半部分”钥匙。“左半部分”(哈希输出的前 32 个字节)(嗯,字节 0字节 31)被钳制为有效的曲线 25519 私有标量“a”,并乘以曲线生成器得到组元素“A”, ed25519 公钥。结果值被序列化回 32 字节,然后将该值以 base64 编码(43 字节,没有最后的填充字节“=”)作为用户的散列密码存储。

这个过程完全是确定性的——没有盐。每个具有相同密码的用户都将拥有相同的哈希密码。每次用户将密码改回之前使用过的密码时,密码的哈希值都会被设置为之前使用过的哈希值。有一个单元测试来验证这个事实。代码单元测试

  1. 登录时发送什么?

当客户端想要使用此方案登录时,服务器发送一个 32 字节的随机 nonce,客户端向用户询问密码,生成相同的 ed25519 私钥并执行我相信是正确的使用私钥对 nonce 的 ed25519 签名并将签名发送回服务器。然后服务器执行我相信的正确 ed25519 签名验证。如果签名验证成功,则您已登录。

这对我来说似乎是安全的 - 执行随机 32 字节的 ed25519 签名应该是安全的,并且永远不会泄露私钥本身,并且签名值很长,因此不会重复。

代码:1 2 3 4 5 6

  1. 没有 TLS 的方案是否安全?

好吧,它不会轻易将您的密码泄露给网络窃听者(尽管使用没有 TLS 的 mysql 会泄露您的所有查询、所有数据,并允许主动攻击者等待您登录,然后接管连接并做任何事情他们想要它)。我不知道这比 login by 好还是坏HMAC(password, random nonce),但我想没关系。

  1. 它对密码转储的抵抗力如何?

一点也不。由于它是完全确定的,它已经失败了。但是我们可以破解密码哈希吗?CPU 上的 curve25519 scalarmut 约为每秒 75,000 个,但在 2013 年它在 GPU 上约为每秒一百万(来源),因此即使不使用查找表,现代密码破解设备也可以非常快速地破解这些密码(您可以这样做,因为这是确定性的!)。所以它完全不是一个像样的密码哈希。

  1. 这个方案叫什么名字?

不知道。“直接将密码散列到 ed25519 私钥”?

  1. 除了 MariaDB 之外,它还被其他任何东西使用吗?

我希望不是。

  1. 还有其他实现吗?

, C #

  1. 最后的话?

MariaDB 文档强烈暗示这是安全的,因为它与 openssh 通过 ed25519 密钥进行身份验证所做的完全一样,但显示了使用人工生成密码的示例,而 ssh-keygen 永远不会发生这种情况。当人类输入的“密码”是至少 256 位长(64 个十六进制字节,从 2048 个单词的字典中选择的 24 个单词)的统一随机值时,此密码散列方案才是安全的——这意味着计算机生成的密钥,而不是人工生成的密码。这对于人工生成的密码是完全不安全的!