代码之家  ›  专栏  ›  技术社区  ›  vlad b.

MD5哈希密码(php)加密(使用salt)的陷阱

  •  1
  • vlad b.  · 技术社区  · 16 年前

    客户机有一个庞大的用户库,我需要以安全的方式加密/散列密码。问题是我不能要求每个用户都更改他们的密码,而且密码已经用md5()散列了,没有盐。一种方法是使用salt加密当前密码,当用户更改或重置密码时,我只使用salt加密。

    这样做是否存在任何陷阱或或多或少明显的危险[我的意思是sha1(md5(password)with salt)]?

    谢谢你抽出时间

    3 回复  |  直到 16 年前
        1
  •  1
  •   rjk    16 年前

    这取决于你试图防御的攻击。如果攻击是某人查看数据库,那么您可以使用对称加密方法(如AES),并在数据库外部定义密钥。使用此方法需要身份验证过程知道加密密钥,并通过使用加密密钥加密哈希密码来更新数据库中的所有行。

    如果上面不是一个选项,你就有问题了。 ;) 问题是,现在您不知道任何用户的密码实际上是什么。你所拥有的只是散列版本。验证登录名的例程是获取用户提供的输入,散列它,并将计算出的散列与存储的散列进行比较。

    您可以选择存储 古老的 散列并创建一个新字段来存储新算法。然后,当人们登录到系统时,执行升级的salted散列并删除 古老的 搞砸。这将如您所期望的那样工作,但如果一个人从未重新登录(或更改其密码),那么他将永远不会升级到哈希的salted版本。

    我个人的观点是使用AES加密选项,因为这样可以防止随意查看散列密码及其覆盖 全部的 数据库中的密码。

        2
  •  3
  •   snemarch    16 年前

    向用户表中添加新字段以存储新字段 安全地 散列密码-为此,请做一些安全的事情涉及每用户盐和多轮。检查别人在做什么,而不是自己动手。

    在进行密码检查时,如果newpass字段为空,请使用旧的密码查找,但在验证后,请敦促用户重新设置密码。

    将当前(旧)密码方案修改为哈希(PerUserSalt+ExistingPasswordHash)应该可以正常工作。

        3
  •  2
  •   Your Common Sense    16 年前

    如果你打算使用 sha1(md5(password).$salt) 没关系。
    您可以进一步使用这个系统。用户更改密码时无需采取任何特殊操作。只需以同样的方式加密: sha1(md5(new password).$salt)