提问人:prime 提问时间:8/23/2023 更新时间:8/31/2023 访问量:44
我们能否利用比特币的想法来摆脱传统的密码方案?(用户名、哈希)
Can we use the bitcoin idea to get rid of traditional password schemes? (usernames, hashing)
问:
我考虑了传统的密码哈希:https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846
然而,比特币有一种方法可以让人们使用人类可读的助记词作为他们“账户”的恢复秘密(BIP-39):https://en.bitcoin.it/wiki/Seed_phrase
他们可以从一个列表中使用 12-24 个英语随机单词,因此该单词集具有很高的熵。 这有助于在一张纸上备份重要机密的传统方法,而不是备份很长的加密密钥。
从高熵种子中,它们以编程方式派生 ECDSA 密钥对或密钥树,并使用公钥作为标识符,使用私钥对可以使用公钥验证的质询进行签名。
我们可以使用类似的系统来摆脱传统密码身份验证的一些问题吗?(例如发送纯文本密码和在服务器上密集使用大量云成本对计算机进行哈希处理,使用个人身份数据作为用户名,不知道服务器是否正确散列或如何处理我们的个人数据)
顺便说一句:网络钓鱼机密的问题可以通过自动填充或谨慎、不经常手动使用机密来解决。
这个想法:
- 生成 25 个随机 base32 标记(26 个字母 + 10 个数字 - I、O、1、0)作为人类可读的密码,可以存储在通行证管理器或便利贴或任何地方(12-24 个单词是很多字符,也可以通过减少字符数和视觉分隔符来实现可读性)
- 我们可以使用 pbkdf2 将客户端上的密码散列为种子,并使用种子生成 ECDSA 密钥对,而不是在服务器上进行密码散列,就像使用 BIP-32 一样: https://en.bitcoin.it/wiki/BIP_0032
- 公钥将作为一种用户名(匿名),存储在服务器上,而不是密码哈希
- 如果泄露,暴力攻击将不得不重新创建计算机密集型密码哈希过程来攻击私钥,就像我们在服务器上存储密码哈希一样
- 通过身份验证,客户端将进行散列,提供公钥并使用私钥登录一些随机的服务器质询,服务器将验证公钥的存在并找到相应的内部用户 ID 并使用公钥验证签名
这似乎是对传统密码管理的帕累托改进:
- 秘密不会传播
- 服务器负载最小,因为 CPU 密集型密码哈希发生在客户端
- 如果公钥在服务器上泄漏,则类似于密码哈希泄漏时:暴力攻击必须执行密集的 pbkdf2 哈希过程(这就是为什么我会使用密码哈希来获取种子)
- 没有个人用户名
- 透明密码哈希
它甚至可以与用户名/电子邮件/电话号码+密码等传统方案一起使用。 初始熵通常不是那么大,腌制没有真正的意义,因此可以使用一种全局盐(胡椒)。但是,由于没有单独加盐每个条目,我们损失了用户名,因为我们没有将纯文本存储在受感染的服务器上,因此在客户端上对用户名+密码进行密码哈希时,熵实际上更高。
至于实现,我考虑了以下库:https://github.com/bitcoinjs/bip32/blob/master/src/bip32.js
但是 Web 加密 API 中可能有本机方法可以执行相同的操作。
答:
有一种使用最近标准化的 ECDSA 和/或 Ed25519 密钥对的现有方法,称为密钥。它们使用与 FIDO2 安全密钥(如 YubiKeys)相同的技术,但它们的存储方式可以跨计算机传输。它们不是用种子生成的,而是伪随机生成的,并存储在某种加密存储中(可能以正常方式受密码保护)。它们通常可以在大多数支持 FIDO2 的网站上使用,只需很少的额外工作。
正如你所提到的,优点是服务器只有一个公钥,而这些公钥已经被普遍认为是安全模型的一部分。由于它们是使用 CSPRNG 生成的,因此假设 CSPRNG 是安全的,因此在功能上无法猜测它们。此外,它们在每个站点都是唯一的,不能与其他密钥关联,因此站点 A 无法仅根据凭据将其用户与站点 B 相关联。
许多网站仍将使用用户名,因为在与其他用户的交互或支持方面为用户提供标识符很方便。由每个站点决定。
请注意,对于 SSH,OpenSSH 已经提供基于 FIDO2 的安全密钥作为特殊密钥类型,因此用户可以使用 ECDSA 或 Ed25519 密钥,其中存储作为安全密钥进行备份,并且 SSH 密钥已经受益于许多与通行密钥相同的好处。
评论