gpt4 book ai didi

encryption - Web 应用程序密码 : bcrypt and SHA256 (and scrypt)

转载 作者:行者123 更新时间:2023-12-03 23:53:36 27 4
gpt4 key购买 nike

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

具体问题

  • 使用整数唯一用户 ID 作为有效盐是否会失败? (crypt() 仅使用 16 位?)
  • 如果我只是在散列上一遍又一遍地运行 sha256() 直到用完一秒钟,这是否可以击败蛮力攻击?
  • 如果我必须问这些问题,我应该使用 bcrypt 吗?

  • 讨论/说明:

    目标很简单,如果我的用户的散列密码被泄露,他们:
  • 不会“容易”破解,
  • 破解一个密码不会暴露其他使用相同密码的用户)。

  • 我读到的 #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 个散列。不是经常建议的一两秒。

    一些相关链接:

    using sha256 as hashing and salting with user's ID

    SHA512 vs. Blowfish and Bcrypt

    What is the optimal length for user password salt?

    最佳答案

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

    我对 bcrypt 的主要担忧是,如果工作系数设置为高,那么它可能会因多个用户尝试登录而使您的系统过载,因此您必须对其进行调整,具体取决于并发登录的数量和系统资源。 ..

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

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

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

  • 您希望只使用数字使盐尽可能大和随机,这使我可以更轻松地遍历所有可能的 id。
  • 多个 sha256 现在可能需要一秒钟,但以后它将不再有效,计算机处理能力呈指数级增长,因此您需要一种可以这样配置的算法。
  • 您通过提问和做功课做正确的事情,如果有更多人这样做,我们就不会发生这么多违规行为
  • 关于encryption - Web 应用程序密码 : bcrypt and SHA256 (and scrypt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963209/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com