Security 我可以通过对现有MD5哈希进行盐析并使用Scrypt或PBKDF2 HMACSHA256对结果进行哈希来提高MD5哈希密码的安全性吗?

Security 我可以通过对现有MD5哈希进行盐析并使用Scrypt或PBKDF2 HMACSHA256对结果进行哈希来提高MD5哈希密码的安全性吗?,security,md5,password-encryption,pbkdf2,scrypt,Security,Md5,Password Encryption,Pbkdf2,Scrypt,我有一个遗留密码数据库,这些密码使用MD5进行了加密和散列。我想更新系统,使数据更安全 第一种选择是,当用户在一段时间后登录并停用旧用户时,将其转换为新的哈希方案(Salt+Scrypt或PBKDF2 HMACSHA256),因此他们必须使用密码恢复功能,该功能将自动更新其哈希 允许我立即升级每个人的另一个选项是,使用现有的MD5哈希,向每个哈希添加一个新的随机salt值,然后使用新的哈希方案(salt+Scrypt或PBKDF2 HMACSHA256)对结果进行哈希,并将该值存储到数据库中并删

我有一个遗留密码数据库,这些密码使用MD5进行了加密和散列。我想更新系统,使数据更安全

第一种选择是,当用户在一段时间后登录并停用旧用户时,将其转换为新的哈希方案(Salt+Scrypt或PBKDF2 HMACSHA256),因此他们必须使用密码恢复功能,该功能将自动更新其哈希

允许我立即升级每个人的另一个选项是,使用现有的MD5哈希,向每个哈希添加一个新的随机salt值,然后使用新的哈希方案(salt+Scrypt或PBKDF2 HMACSHA256)对结果进行哈希,并将该值存储到数据库中并删除旧值

然后当用户登录时,我必须应用旧的,然后是新的方法。我更喜欢第二个选项,因为它允许我尽早从数据库中删除所有旧的不安全哈希

对现有哈希进行盐分和重新灰化是否安全?MD5是否已损坏,以至于我可以运行一个脚本来消除密码散列,并使用新方案重新散列密码


或者最好的解决方案是将这两种选择结合起来?通过这种方式,我不必在数据库中保留现有的MD5哈希值,我可以将用户迁移到新系统一段时间?

MD5不会太坏,因此您可以轻松地对所有密码进行反哈希,但如果密码的质量不太好,那么您可能会强制使用它们并将其转换为新密码,更安全的格式。MD5的脆弱性源于其相对较小的长度(更多的碰撞面)和计算简单(这意味着暴力攻击比SHA2等运行时复杂度更高的算法更可行)

如果我是你,我会使用你列出的两种方法(因为正如你提到的,快速移动密码对于防止数据库被黑客攻击非常重要)。首先,我将强制所有强制MD5密码,并将其转换为新格式。我在过去做过,到目前为止,最好的结果是使用Cuda或OCL口味,因为它们使用GPU,速度快200倍。如果Hashcat太难(学习曲线可能很陡),那么尝试一下。它比HashCat慢得多,但使用起来容易得多

对于无法破解的密码,请使用户帐户过期并让他们重置密码。或者为了更好地对待用户,只需在下次用户登录时通过发送两个哈希将数据库中的密码更新为新格式即可。如果MD5检出,则销毁它并用新格式替换它。这些只是一些想法

编辑:


忘了提到,如果您只想将MD5密码散列成新的格式,这在安全性方面是很好的,尽管这会给代码增加另一层复杂性,并且在存在复杂性的地方,存在实现缺陷的空间。只是想一想。

这实际上是你的一个非常巧妙的想法。通常我会:

  • 等待用户返回
  • 意识到他们存储的密码需要更新
  • 现在我在内存中有了他们的(已知有效)密码:用新算法重新设置它
  • 将新哈希存储在数据库中
只使用MD5的缺点是很容易使用暴力。通过(暂时)在应用真正的scrypt/Argon2之前将MD5结果作为中间步骤来处理,您可以阻止残酷的尝试

在“真实”密码哈希之前使用快速哈希算法作为预处理步骤并非闻所未闻,甚至可能很有用

  • BCrypt的已知密码长度限制为72字节(71个utf-8字符,然后是空终止符)。在通过bcrypt运行之前。通过首先通过散列运行长密码,他们克服了71个字符的限制
  • 这不仅克服了密码长度限制(避免截断或限制密码大小),而且还可以防止出现拒绝服务攻击。BCrypt和Scrypt易受密码较长的攻击(我不知道Argon2)
因此,使用预哈希(虽然不一定是MD5)可能有好处

我不知道您当前如何存储MD5哈希。MD5是128位的。假设将其存储在Base64中,则可以轻松识别它:

  • MD5
    nMKuihunqT2jm0b8EBnEgQ==
期望的最终目标类似于scrypt:

  • MD5
    nMKuihunqT2jm0b8EBnEgQ==
  • scrypt
    $s0$e0801$epIxT/H6HBBWHEHEHFNH/bw==$7H0vsXlY8UxxyW/BWx/9GY7JEVGJT71GFD6O4SZND0=
因此,在根据保存的哈希验证凭据时,您可以确定它是哪个哈希,并使用适当的算法。增加计算复杂性的中间步骤是为以下内容定义自己的格式:

MD5+scrypt

比如:

  • MD5
    nMKuihunqT2jm0b8EBnEgQ==
  • MD5+scrypt
    md5s0$e0801$eX8cPtmLjKSrZBJszHIuZA==$VAPD0U4TYVDOxOLICKFMROEIR1ML2UE1L2+FVOJgbcI=
  • scrypt
    $s0$e0801$epIxT/H6HBBWHEHEHFNH/bw==$7H0vsXlY8UxxyW/BWx/9GY7JEVGJT71GFD6O4SZND0=

现在,您可以根据保存的哈希值识别正在使用的算法,并可以分块升级密码。

密码可能重复。(不完全相同,但大多数答案听起来也适用于这里。)刚刚发现一个。。。最重要的方面是尽快删除/保护当前数据。“MD5的中断是由于其相对较小的长度(更多的碰撞面)和计算简单”——真正的