【问题标题】:Rehashing Existing Passwords That Were Hashed With An Outdated Function重新散列使用过时函数散列的现有密码
【发布时间】:2018-09-21 03:29:53
【问题描述】:

我们有一个使用 MS 会员提供程序存储密码的旧系统,并且刚刚发现它只使用带有随机盐的 SHA1 来存储密码,因此显然我们担心这种情况。我知道理想的情况是强制重置全局密码,但出于各种原因,我们希望尽可能避免这种情况,并保持现有密码不变。我做了一些探索,并设法找到了一些源代码,并且可以重新散列我的密码,所以我得到与它的存储版本相同的结果,所以我想覆盖所有适当的方法来重新实现以安全的方式编码。

我打算做的是使用当前“安全”哈希(AFAIK,当前的方法仅归类为安全由于暴力破解密码所需的计算时间量,所以如果系统性能得到大幅提升,整个编程世界最终可能不得不重新审视这一点),然后将这个散列包装在代码中现有的散列周围,但我有 2 个问题:-

这真的安全吗?据我所知,每个散列都需要增加熵的量,我 90% 肯定会这样做,但是这样做有什么问题需要我注意吗?我还猜测在散列链中,它是确定“基线”安全级别的最强散列函数,但我想我会仔细检查散列“不安全”散列没有任何奇怪的数学怪癖.我确定不是,但由于问题的性质,我宁愿问一个愚蠢的问题也不愿做出任何不正确的假设,因为我没有真正研究过散列函数的技术方面。

我是否应该在重新散列之前将盐重新应用于当前散列。我对此的想法是,以防万一存在将旧哈希转换为新哈希的现有计算表 - 以防万一邪恶的人做了繁重的工作以试图绕过此方法。我相信 b-crypt 可能已经包含盐,但如果我使用不包含盐的替代品,我猜应该包含一个?

【问题讨论】:

    标签: security hash passwords


    【解决方案1】:

    如果您不能等待下一次用户登录并且不想强制登录,双重哈希是立即保护非常弱密码哈希的好方法。弱密码哈希包括未加盐的哈希或非常快的哈希,例如 SHA-*/MD5。

    所以你可以像这样准备你的数据库:

    1. 使旧盐在数据库中持久化,您需要oldSalt 来验证双重哈希。
    2. 计算双重哈希并将其存储在数据库newHash = newSafeHashFunction(oldHash, newSalt)中。现在安全的散列函数是 BCrypt、SCrypt、Argon2 和 PBKDF2。生成满足新密码哈希函数要求的新盐。
    3. 下次登录成功后,双哈希应该换成纯新算法newSafeHashFunction(password, newSalt)

    大多数密码哈希实现会自行生成安全盐并将其包含在生成的密码哈希字符串中,因此无需单独生成和存储它们。用户下次登录时,可以这样验证密码:

    if (checkIfDoubleHash(storedHash))
      correctPassword = newSafeHashFunction(oldUnsafeHashFunction(password, oldSalt), storedHash)
    else
      correctPassword = newSafeHashFunction(password, storedHash)
    

    ➽ 注意函数checkIfDoubleHash(),它是双重哈希的关键和常见陷阱。如果我们通常接受newSafeHashFunction(password, storedHash) 并且攻击者可以获得旧备份,或者具有早期 SQL 注入的值,那么他可以直接使用旧哈希作为密码。

    checkIfDoubleHash() 的实现可以像检查旧盐一样简单,或者可以在将哈希标记为双哈希时作为未来证明。大多数框架已经提供了一个password_hash() 函数,它添加了这样一个“标记”,因此它们可以在必要时切换到更新的算法。

    $2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |
     hash-algorithm-descriptor = 2y = BCrypt
    

    这是 Unix crypt() 函数经常采用的格式。没有什么可以阻止您将自己的描述符用于双哈希。当然标记也可以存储在单独的数据库字段中。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2017-10-14
      • 2013-10-13
      • 2017-06-21
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多