Encryption bcrypt和blowfish的密码最大长度

Encryption bcrypt和blowfish的密码最大长度,encryption,passwords,password-encryption,password-storage,password-policy,Encryption,Passwords,Password Encryption,Password Storage,Password Policy,我的问题由此而来 我正在使用bcrypt(河豚)散列密码。所以,正如我从这个问题中发现的 它的字符限制为72 所以,我开始考虑限制密码的最大长度,但是在这些问题和答案之后 所有人都反对这一点。提到一些事情,比如 节省存储空间 旧的Unix系统经验 与不支持长密码的旧系统的交互 惯例(即“我们总是这样做”) 单纯的天真或无知 以明文存储 此外,密码字段上指定的最大长度应被解读为安全警告,通过此答案- 等 因此,我认为我与其中一个案例不符。当然,我同意愚蠢的限制,比如最大长度为10,甚

我的问题由此而来

我正在使用bcrypt(河豚)散列密码。所以,正如我从这个问题中发现的

它的字符限制为72

所以,我开始考虑限制密码的最大长度,但是在这些问题和答案之后

所有人都反对这一点。提到一些事情,比如

  • 节省存储空间
  • 旧的Unix系统经验
  • 与不支持长密码的旧系统的交互
  • 惯例(即“我们总是这样做”)
  • 单纯的天真或无知
  • 以明文存储
  • 此外,
    密码字段上指定的最大长度应被解读为安全警告
    ,通过此答案-
因此,我认为我与其中一个案例不符。当然,我同意愚蠢的限制,比如最大长度为10,甚至更糟的是,8或6,但长度为30、40或更长的密码(加盐)不被认为是安全的吗? 从这篇文章(虽然有点旧),但它说

it can make only 71,000 guesses against Bcrypt per second

这是8个字符的密码。因此,我想象一下,随着彩虹表的大小呈指数级增长,定制彩虹表将有多大的规模,只需强制使用一个30个或更多字符的密码(考虑到每个密码都有自己的salt)

引用同一篇文章的评论

每次在密码中添加一个字符时,您的密码都是指数级的 增加了通过蛮力破解的难度。对于 例如,8字符密码的键空间为95^8个组合,而 20个字符的密码具有95^20个组合的键空间

因此,对于一个使用bcrypt的长度为20的密码来说,这是必要的 95^20/(71000*3600*24*365)~10年的28度(如果我做得对的话)

qsn1:现在,在这种情况下,对于河豚来说,没有将密码最大长度限制为72的意思,因为在任何情况下之后,所有内容都将被截断,因此这里没有额外的安全增益

qsn2:即使存在salt(对每个用户来说都是唯一的,并且保存在db中),毕竟我想在密码中添加pepper(在应用程序中硬编码,而不是保存在db中)。我知道如果增加一些额外的安全性,但我认为万一如果DB(或DB备份)只泄漏,胡椒将是有用的。 所以,为了能够添加20个字符的胡椒粉,我需要将密码的最大长度设置为50左右。我的想法是这样的:假设用户使用70个字符,在大多数情况下(如果不是全部),它将是一些短语或类似的smth,而不是生成一个强的,因此将用户限制为50个最大长度,并添加另一个20-22个字符的pepper,这肯定更安全/随机。另外,假设黑客正在使用“常用短语”彩虹表,我认为比起
50个字符的常用短语+22个字符的随机字符串,
72个字符的常用短语
被黑客攻击的几率更高。那么,这种使用pepper和最大长度为50的方法是否更好,或者我做的smth是错误的,最好保留最大长度为72的限制(如果qsn1是正确的)

谢谢

顺便说一句:

根据Owasp,密码的合理最大长度为160

谷歌的密码最大长度为100

Wordpress的最大限制为50


问题1:根本没有理由限制密码长度,BCrypt将使用更长的密码,尽管只使用72个字符。您将毫无优势,但从理论上讲,您将阻止使用密码管理器的人使用更长的密码。如果将来切换到另一种算法,限制可能会有所不同,因此没有理由限制为72个字符

问题2:您最好使用另一种方法:使用服务器端密钥加密密码散列,而不是尖刻。添加pepper的原因是,攻击者必须获得服务器上的权限,因为没有密钥,他无法开始强制执行哈希(SQL注入或丢弃数据库备份都不行)。与加密(双向)散列具有相同的优势

  • 这样您就不需要为胡椒保留字符,您可以使用密码中的所有72个字符
  • 与pepper不同的是,只要有必要,服务器端密钥可以随时交换。胡椒粉实际上成为密码的一部分,在下次登录之前无法更改
  • 另一点是,辣椒理论上可能会干扰哈希算法

  • 除了对用户提供的密码进行简单的散列之外,还存在其他使用bcrypt安全地散列任意长字符串的情况。您可能还希望在将密码传递到bcrypt之前对其进行加密,以获得更高级别的熵

    我用来绕过字符限制的一个算法是使用中间哈希。因此,我没有直接对密码进行散列,而是使用一种较弱的散列机制,在bcrypt的长度限制内生成一个较短的字符串,然后使用bcrypt对该中间字符串进行散列。中间散列不必像bcrypt那样是强散列,但是如果使用高度随机的长salt,则可以最大限度地提高这种方法的有效性。我当前的中间哈希是sha512

    我使用哈希密码的步骤如下:

  • 使用/dev/uradom等源生成一个长的、加密安全的salt。(按每个用户执行此操作。如果您愿意,还可以附加应用程序范围的salt。)如果您计划将来进行密码验证,则需要存储此salt
  • 将salt连接到用户提供的密码
  • 将连接的值馈送到sha512并捕获结果,结果将是代表he的128个字符的字符串