使用php哈希随机盐,将盐存储在临时用户表上


Using php hash random salt, store salt on temporary user table?

我正在用php创建一个登录系统。我有一个用于电子邮件检查的自定义表,该表获取用户注册数据,然后将其移动到表用户。

我想知道创建随机盐并使用散列密码将其存储在临时用户表上是否安全,或者最好只存储普通密码,他们在用户确认后对其进行哈希处理并创建盐?

我在想用户可以使用各种电子邮件地址(无法真正验证)进行大规模"注册"并减慢服务器速度(因为盐和哈希创建函数)。顺便说一下,在之后创建哈希会导致非触发(我正在使用 MySQL)情况,因为某些值必须手动添加(创建)。

您可以生成一个长随机盐,将盐附加到密码前面,并使用标准加密哈希函数(如 SHA256)对其进行哈希处理。然后将盐和哈希都保存在用户的数据库记录中。切勿存储明文密码!

当您想要验证用户的登录时,您需要做的就是从数据库中检索用户的盐和哈希,将盐附加到给定的密码并使用相同的哈希函数对其进行哈希处理。然后将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则,密码不正确。

不要:

  • 使用过时的哈希函数,如 MD5 或 SHA1
  • 使用不安全的加密版本($ 1$, $2$, $2a$, $2x$, $3$)
  • 使用您自己设计的任何算法。仅使用公共领域并经过经验丰富的密码学家充分测试的技术

更多信息

如果您真的担心服务器速度变慢,那么只需等到用户单击确认链接即可。然后让用户选择自己的密码并存储其哈希值。这样,您可以完全避免生成盐和哈希(对于虚假帐户),并且具有不必生成机器密码的优势。

不应该做的是,在没有好盐的情况下存储密码哈希。如果您从DEV_URANDOM读取(不使用DEV_RANDOM),那么您的服务器应该没有阻塞问题,并且不应该因为盐的生成而变慢。

请记住,还有其他方法可以减慢服务器速度,例如,攻击者可以使用登录表单来引发哈希计算。

顺便说一下,使用像 password_hash() 这样的适当函数,没有理由自己生成盐,这个函数将尽最大努力生成安全的盐,并且它将使用应该用于密码的慢速密钥派生函数 (BCrypt)(不是 SHA-* 甚至 MD5)。