Encryption Web应用程序密码:bcrypt和SHA256(和scrypt)

Encryption Web应用程序密码:bcrypt和SHA256(和scrypt),encryption,passwords,hash,salt,bcrypt,Encryption,Passwords,Hash,Salt,Bcrypt,在最近(例如LinkedIn)关于密码的讨论中,我正在研究密码哈希实现。喝了两杯咖啡,早上读了一篇文章,我和刚开始读的时候一样,不再是一个密码学家了。我真的不想假装我是 具体问题 使用整数唯一用户ID作为有效salt是否失败?(crypt()仅使用16位? 如果我只是在一个散列上反复运行sha256(),直到一秒钟用完为止,这是否能击败暴力攻击? 如果我必须问这些问题,我应该使用bcrypt吗? 讨论/解释: 目标很简单,如果我的用户的散列密码被泄露,他们: 不是"容易"破解的, 破解一个密码不

在最近(例如LinkedIn)关于密码的讨论中,我正在研究密码哈希实现。喝了两杯咖啡,早上读了一篇文章,我和刚开始读的时候一样,不再是一个密码学家了。我真的不想假装我是

具体问题
  • 使用整数唯一用户ID作为有效salt是否失败?(crypt()仅使用16位?

  • 如果我只是在一个散列上反复运行sha256(),直到一秒钟用完为止,这是否能击败暴力攻击?

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

  • 讨论/解释: 目标很简单,如果我的用户的散列密码被泄露,他们:

  • 不是"容易"破解的,
  • 破解一个密码不会暴露使用相同密码的其他用户)
  • 我读到的关于#1的内容是,散列计算一定很昂贵——比如说,计算需要一两秒钟,可能需要一些位或内存(以阻止硬件解密)

    bcrypt内置了这个功能,如果我理解正确的话,scrypt更适合未来,并且包含最低内存使用要求

    但是,将sha256()的结果“重新灰化”几秒钟,然后将最终循环计数与哈希一起存储,以便以后检查提供的密码,这是一种同样有效的方法吗

    对于#2,为每个密码使用唯一的salt非常重要。目前尚不清楚的是盐的随机性(或数量)。如果目标是避免所有使用“mypassword”作为密码的人使用相同的哈希值,那么仅仅这样做还不够吗

    hash = sha256_hex( unique_user_id + user_supplied_password );
    
    甚至这个,尽管我不确定它能给我带来什么:

    hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
    
    我从使用用户ID中看到的唯一好处,除了我知道它是唯一的之外,就是避免了将盐和散列一起保存。没什么优势。使用用户ID作为salt是否真的有问题?这难道不能实现#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\u wide\u string”并在运行字典攻击时使用它,对吗

    如上所述,是否有充分的理由使用bcrypt覆盖我自己的?也许我问这些问题就足够了

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

    一些相关链接:


    Bcrypt非常好,因为你可以将功因数从4调整到31,每个增量都会产生一个指数级的所需时间,我已经用图表表示了,功因数为14时,它已经占用了一秒钟多的时间,所以随着计算机越来越快,你只需要更改一个参数,当然还需要更新密码哈希

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

    仍然需要salt,它们的主要目的是阻止离线攻击,如果salt空间太大,那么对手将无法生成查找表,64位salt似乎有点低,bcrypt有128位salt,再加上功因子,这对离线攻击来说是一个相当大的挑战。。。是的,每个密码的salt应该是随机的,bcrypt将为您生成一个,如果您对每个密码使用相同的salt,那么您就使得对手更容易使用在线攻击来压缩所有密码

    如果你正确设置了功因子,那么Bcrypt在网络攻击方面确实很出色,因为即使我得到了哈希值,也就是说如果“对手”得到了哈希值,功因子也会让你很痛苦地翻阅整个字典,需要几天的时间,如果字典中没有密码,然后我真的遇到了麻烦,因为暴力攻击将是史诗般的,bcrypt的密码位空间非常大,但有限:)

    Sha256现在可能需要一点时间,但最终计算机会越来越快,攻击也会越来越容易,unix的家伙们认为crypt太慢了,根本不会成为问题,今天我在几秒钟内完成了一次在线攻击,几天内完成了离线攻击,一次蛮力攻击(查看整个密码位空间)几周后

  • 您希望salt尽可能大且随机,仅使用数字使我更容易遍历所有可能的ID。
  • 多个sha256现在可能需要一秒钟,但今后它将不再有效,计算机的处理能力呈指数级增长,因此您需要一种可以进行配置的算法。
  • 如果有更多的人这样做,我们就不会有这么多违规行为
  • 使用整数唯一用户ID作为有效salt是否失败?(crypt()仅使用16位?)

    通常情况下,您会使用随机生成的salt,然后将该哈希值与加密密码一起存储。攻击者是否也可以访问salt并不重要——其目的是防止使用查找表,从而迫使攻击者单独强制每个哈希值

    crypt
    只需将salt和hash存储到一个字符串中,以及要使用的算法。

    谢谢。还有