加密哈希的不安全版本

信息安全 哈希 bcrypt 软件
2021-08-25 01:28:09

我在crackstation上读到不要使用bcrypt* 的这些变体($1$、$2$、$2a$、$2x$、$3$),但我最近在各种敏感的实现中使用了bcrypt($2a$) 。
任何安全专家都可以澄清为什么推荐 ($2y$, $5$, $6$) 而不是 ($1$, $2$, $2a$, $2x$, $3$),Niels Provos 提出的原始版本是什么,以及他们的不同之处


bcrypt 是 Niels Provos 和 David Mazières 基于 Blowfish 密码设计的密码密钥派生函数,并于 1999 年在 USENIX 上提出。除了包含盐以防止彩虹表攻击之外,bcrypt 还是一个自适应函数:随着时间的推移,可以增加迭代次数以使其变慢,因此即使计算能力增加,它仍然可以抵抗暴力搜索攻击。

2个回答
  • 2 - 最初的 BCrypt,在 BCrypt 流行之前很长时间因为安全问题而被弃用。

  • 2a - 官方 BCrypt 算法和 crypt_blowfish中的不安全实现

  • 2x - 建议用于由不安全算法创建的哈希以实现兼容性
  • 2y - 为固定 crypt_blowfish 建议的新标记

因此,由原始算法或 java 端口创建的 2a 散列很好,与 crypt_blowfish 创建的 2y 散列相同。但是 crypt_blowfish 创建的 2a 哈希是不安全的。

  • 5 是 sha256crypt
  • 6 是 sha512crypt

shaXXXcrypt 算法受到 bcrypt 的启发,但使用 sha2 代替河豚作为哈希函数以满足美国的合规性要求。

BCrypt 变种

  • $2$

    原始规范使用前缀 $2$。这与其他算法前缀形成对比:

    • $1$ - MD5
    • $5$ - SHA-256
    • $6$ - SHA-512
  • $2a$

    原始规范没有定义如何处理非 ASCII 字符,或者如何处理空终止符。对规范进行了修订,以指定在散列字符串时:

    • 字符串必须是 UTF-8 编码的
    • 必须包含空终止符
  • $2x$(2011 年 6 月)$2y$

    BCrypt的 PHP 实现 crypt_blowfish 中发现了一个错误。

    这是第 8 位设置的错误处理字符。他们建议系统管理员更新他们现有的密码数据库,用 替换$2a$$2x$以表明这些哈希是错误的(并且需要使用旧的损坏算法)。

    他们还提出了让crypt_blowfish$2y$为固定算法生成的哈希值发出的想法。没有其他人,包括规范的 OpenBSD,采用2x/的想法2y此版本标记仅限于 crypt_blowfish

    http://seclists.org/oss-sec/2011/q2/632

  • $2b$ (2014 年 2 月)

    在 bcrypt 的 OpenBSD 实现中发现了一个错误。

    他们将字符串的长度存储在一个无符号字符中。如果密码长度超过 255 个字符,它将溢出并在 255 处换行。

    BCrypt 是为 OpenBSD 创建的。因此,当他们的库中出现错误时他们认为可以修改版本。这意味着如果您想保持最新的“他们的”规范,其他所有人都需要效仿。

    http://undeadly.org/cgi?action=article&sid=20140224132743
    http://marc.info/?l=openbsd-misc&m=139320023202696