对于高熵凭证,SHA256 散列是否足够好?

信息安全 密码 哈希 bcrypt sha256
2021-08-22 12:45:08

假设我有一个由客户端用作 API 密钥的高熵凭证(例如 256 位随机值)数据库。我想在我的数据库中对它们进行哈希处理,以便数据库泄露不允许攻击者使用被盗凭据访问我的 API。

现在,鉴于我已经保证了高熵值(没有简短或容易猜到的“密码”),像 bcrypt 这样的东西真的有优势吗?我可以使用无盐 SHA256 来做同样有效的事情吗?

2个回答

除了@NeilSmithline 的出色回答之外,我还想提出几点。

取一个 256 位随机值并使用 SHA-256 对其进行散列,输出仍将具有(大约)256 位熵。我说“大致”是因为 SHA256 是否真的映射到 256 位上的每个可能的字符串是一个悬而未决的问题 - 但出于所有实际目的,它已经足够接近了。

Bcrypt: bcrypt 的优势在于,它要求攻击者对每次猜测进行多轮散列 - 从而减慢他们的速度并提高他们的电力成本。

暴力破解:假设某个傻瓜想尝试暴力破解您的 SHA256'd 256 位随机字符串。平均而言,他们必须做出 2 255次猜测。假设每个猜测花费 1 纳秒并消耗一个电子的能量,则需要10 60(即 10 50 * ageOfUniverse),并且需要一个消耗相当于9,000 个银河系能量的动力装置。2 256是一个很大的数字。

底线:所以,是的,没有人会暴力破解您通过无盐 SHA256 运行的 256 位随机值,没有理由以 bcrypt 的形式添加额外的计算。考虑到安全性并提出好的问题,这对你很好:-)

(实际上,薄弱环节是您的随机数生成器,而不是散列。如果攻击者可以缩小生成这些随机值的 RNG 的可能种子列表,那么字典攻击可能是可能的。在这种情况下,bcrypt 可能添加一些有用的减速。)

是的。Salt 用于防止预计算攻击,但随机 256 位字符串对于预计算来说太大了。具有多次迭代的慢散列函数旨在减缓字典攻击,但随机 256 位字符串对于字典或详尽测试来说太大了。因此,单个 SHA256 哈希对于长的、加密安全的随机输入是安全的。