13

随着最近(例如LinkedIn)关于密码的所有讨论,我正在研究密码散列实现。在喝了两杯咖啡和早上阅读之后,我不再是一个密码学家了,就像我刚开始时一样。我真的不想假装我是。

具体问题

  1. 使用整数唯一用户 ID 作为有效盐会失败吗?(crypt() 只使用 16 位?)

  2. 如果我只是在哈希上一遍又一遍地运行 sha256() 直到用完一秒钟,这是否会击败蛮力攻击?

  3. 如果我必须问这些问题,我应该使用 bcrypt 吗?

讨论/解释:

目标很简单,如果我的用户的散列密码被泄露,他们:

  1. 不会“容易”破解,
  2. 破解一个密码不会暴露使用相同密码的其他用户)。

我读到的#1 是哈希计算必须很昂贵——比如说,需要一两秒来计算,并且可能需要一点或内存(以阻止硬件解密)。

bcrypt 内置了这个,如果我理解正确的话,scrypt 更具前瞻性,并且包括最低内存使用要求。

但是,通过“重新散列” sha256() 的结果多次以用完几秒钟,然后将最终循环计数与散列一起存储以供以后检查提供的密码,这是否是一种同样有效的消磨时间的方法?

对于#2,为每个密码使用唯一的盐很重要。尚不清楚盐必须有多随机(或大)。如果目标是避免使用“mypassword”作为密码的每个人都拥有相同的哈希值,那么仅仅这样做还不够吗?:

hash = sha256_hex( unique_user_id + user_supplied_password );

甚至这个,虽然我不确定它能给我带来什么:

hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );

除了我知道它是唯一的之外,我可以从使用用户 ID 中看到的唯一好处是避免将盐与哈希一起保存。没有太大的优势。使用用户 ID 作为盐是否存在真正的问题?它没有完成#2吗?

我假设如果有人可以窃取我用户的散列密码,那么我必须假设他们可以获得他们想要的任何东西——包括生成散列的源代码。那么,在散列之前向密码添加一个额外的随机字符串(相同的字符串)有什么好处吗?那是:

# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );

我已经看到了这个建议,但我不明白我从每个用户的盐中获得了什么。如果有人想暴力破解攻击,他们会知道“app_wide_string”并在运行字典攻击时使用它,对吧?

如上所述,是否有充分的理由使用 bcrypt 而不是我自己的滚动?也许我问这些问题的事实就足够了?

顺便说一句——我刚刚在我的笔记本电脑上计时了一个现有的散列函数,我每秒可以生成大约 7000 个散列。不完全是通常建议的一两秒。

一些相关链接:

使用 sha256 作为用户 ID 的散列和加盐

SHA512 与 Blowfish 和 Bcrypt

用户密码盐的最佳长度是多少?

4

2 回答 2

8

Bcrypt 很棒,因为您可以将工作因数从 4 调整到 31,每个增量都会创建一个指数所需的时间,我实际上已经绘制了它,在 14 的工作因数下它已经花费了一秒多,因此随着计算机变得越来越快您只需要更改一个参数,当然还需要更新您的密码哈希...

我对 bcrypt 的主要担心是,如果工作因子设置为高,那么它可能会在多个用户尝试登录时使您的系统过载,因此您可以根据并发登录的数量和系统的资源对其进行调整。 ..

盐还是需要的,主要目的是阻止离线攻击,如果盐空间太大,那么对手将无法生成查找表,64位盐似乎有点低,bcrypt有128位盐加上工作因素使得离线攻击成为一个相当大的挑战......是的,每个密码的盐应该是随机的,bcrypt会为你生成一个,如果你为每个密码使用相同的盐,那么你已经成功了攻击者更容易使用在线攻击来破解所有密码。

如果你正确设置了工作因素,Bcrypt 真的很适合在线攻击,因为即使我得到了哈希,意思是说如果“对手”得到了哈希,工作因素会让翻阅整个字典变得非常痛苦,花费数天时间,如果密码不在字典中,那么我真的有麻烦了,因为暴力攻击将是史诗般的,bcrypt 的密码位空间虽然有限但相当大:)

Sha256 现在可能需要一些时间,但最终计算机会变得越来越快,并且很容易受到攻击,unix 人认为 crypt 太慢了,它永远不会成为问题,今天我做了一个几秒钟内的在线攻击,几天内的离线攻击,几周内的暴力攻击(遍历整个密码位空间)......

  1. 您希望盐尽可能大且随机,仅使用数字使我更容易迭代所有可能的 id。
  2. 多个 sha256 现在可能需要一秒钟,但以后它不会再有效了,计算机处理能力呈指数增长,所以你需要一个可以这样配置的算法。
  3. 提问和做功课是正确的,如果有更多的人这样做,我们就不会有那么多违规行为
于 2012-06-09T18:21:14.480 回答
0

使用整数唯一用户 ID 作为有效盐会失败吗?(crypt() 只使用 16 位?)

您通常会使用随机生成的盐,然后将该哈希与加密密码一起存储。攻击者也可以访问盐并不重要——它的目的是防止使用查找表,从而迫使攻击者单独暴力破解每个哈希值。

crypt只需将盐和哈希以及要使用的算法存储到一个字符串中。

于 2012-06-10T07:12:35.790 回答