【问题标题】:php converting all passwords in DBphp转换数据库中的所有密码
【发布时间】:2012-05-16 06:00:01
【问题描述】:

大家好,我最近开始使用

$salt = $uniqueSalt;

$cryptpassword = md5($salt.$password);

如何用这个转换我的mysql数据库中的所有密码,以免影响用户?

我的数据库 atm 中的密码是纯文本的,我想用 salt 将所有纯文本密码转换为 md5

【问题讨论】:

  • 每个哈希的盐不应该是唯一的。
  • @Gumbo:你不是说每个哈希应该唯一的盐吗?
  • @Rocket 是的,当然;我已经修改了句子,但这与我想说的完全相反。很遗憾,我无法再次编辑它。
  • 如果您想对密码进行哈希处理,请查看 phpass 和这个问题 stackoverflow.com/questions/401656/…

标签: php mysql encryption md5 salt


【解决方案1】:

我建议您阅读有关盐及其使用方法的更多信息。它们不应该是一个常量字符串,而是每个用户独有的东西。例如用户名。或者我个人最喜欢的:注册日期(当然精确到 1 秒)。

此外,如果您将密码作为 MD5 哈希值存储在数据库中,则无法转换密码。 MD5 是一种散列方式,您无法获取原始密码以应用盐和重新散列。如果您绝对想应用此功能,那么您可以做到这一点的唯一方法是强制每个用户更改其密码并在他们这样做时应用新算法。这有两个问题:

  • 大多数用户不会喜欢这个
  • 您必须跟踪哪些用户进行了更改,哪些没有进行更改。这是为了防止登录时出现问题。

【讨论】:

  • 您不必强制用户更改密码。您可以在用户登录时首先检查他们是否已经使用新的哈希系统,如果没有使用旧系统检查他的密码,如果正确,则根据他提供的密码生成新的哈希。如果他已经准备好使用新系统,只需使用新的哈希系统进行验证。一段时间后,您可以强制用户重置密码以完全迁移到新的哈希系统。
  • @Zombaya 你是对的。我没有想到这一点。感谢您的提示:)。
  • 除了散列之外最好使用迭代计数(MD5 散列现在非常快,别管那些彩虹表了)。应用迭代计数的最佳方法是使用 bcrypt 或 PBKDF2 等算法。
  • SoboLAN,注册日期对我来说不是很独特,用户名也不是。例如,攻击者可以轻松地比较不同站点之间的 MD5 值。最好在用户名前加上服务器的主机名,以使其在各个站点之间保持唯一,或者更好地为每个用户存储一个安全的随机盐(8 个字节或更多)。
  • @owlstead 当我说注册日期时,我的意思是精确到 1 秒。但你是对的:盐必须使用这些元素的组合:)。
【解决方案2】:

就像这样,但你必须更改登录名,所以你不检查他们的密码,而是检查 md5($salt.$password);

但正如我的前传者所说,它并没有更安全,如果密码在您的数据库中已经不是明文,如果它已经过哈希处理,您可能不会将其作为纯文本获取

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2018-10-28
    • 2023-03-11
    • 2017-11-10
    • 2019-05-02
    相关资源
    最近更新 更多