这对我来说听起来很棒。
生成密码的全部意义在于选择一个攻击者极难猜出且授权用户易于记住和输入的密码。理想情况下,密码生成过程应该生成极难猜出的密码,即使攻击者确切地知道您使用了哪个密码生成过程(Kerckhoffs 原则)。如果“完美知识”攻击者发现很难猜出密码,那么其他攻击者会发现更难。
我将假设您使用的/dev/random
是未损坏的(它连接到硬件随机数生成器或加密安全的伪随机数生成器)。
很多人似乎觉得,一个随机选取的大写字母,随机选取的小写字母,再加上一个随机选取的数字,一共10个字符组成的所谓“10位随机密码”就绰绰有余了用于许多目的。这给出了 ln2( 26^9 * 10 ) = 45.6 bits of password strength。
如果您完全从 7776 个单词(6^5 个单词)的任何列表中随机挑选单词,例如标准 Diceware 列表或更易于在电话上键入的 Dialdice 列表,并且攻击者确切知道您是哪个单词列表使用,并且您的用户选择您选择的前 4 个单词,按照您选择它们的顺序,用户获得 ln2( (6^5)^4 ) = 51.7 位密码强度。
增加随机性?
如果用户随机点击刷新键,然后掷骰子从您呈现的单词中随机选择 4 个单词,然后掷骰子将这些单词随机排列以生成 4 个单词的 Diceware密码短语,然后(再次假设/dev/random
没有损坏)我可以先验地计算它没有效果——用户仍然有 51.7 位的密码强度。
如果用户认为密码强度不够,那么我认为您的系统应该允许用户添加额外的字母、符号、单词等。
非随机选择的影响
您的用户不太可能做出完全随机的选择,但这没关系。在最坏的情况下——你的用户按字母顺序或选择其他顺序,攻击者不知何故知道确切的顺序,你已经从 4 中丢失了 -ln2( 4! ) = -4.6 位的密码强度-word Dialdice 密码。
如果我们假设用户总是拒绝某些单词,并不断刷新,直到他可以在没有这些单词的情况下创建密码,并且这些单词占字典的 1/6 左右,并且攻击者不知何故知道这些单词是什么,那么对于 4 -word Dialdice 密码我们已经丢失了大约 -1 的总密码强度。(最坏的情况是用户每按下刷新按钮 2^N 次就会丢失 N 位密码强度——但这对我来说似乎并不现实)。
这两种效果的结合使您的用户拥有 46.1 位的密码强度和 4 字的 Dialdice 密码 - 比 10 个随机字符的密码更强大,并且更容易记住。
如果您后来认为密码强度不够,则可以直接增加密码短语中的最小单词数,或切换到包含更多单词的单词列表,或两者兼而有之。(您可以使用“将旧 md5 密码迁移到 bcrypt 密码”中的方法来强制使用旧的、低强度密码的每个人升级到新的、更高强度的密码)。
这对我来说听起来很棒。