我在php中创建一个登录系统。我有一个用于电子邮件检查的自定义表,它获取用户注册数据,然后将其移动到表用户。
我想知道在临时用户表上创建随机盐并将其与散列密码一起存储是否安全,或者最好只存储普通密码,然后在用户确认后将其哈希并创建盐?
我在想,用户可以通过各种电子邮件地址(无法真正验证)进行大规模“注册”,并减慢服务器速度(因为salt和hash创建函数)。顺便说一句,创建哈希之后导致非触发(我正在使用MySQL)的情况,因为一些值必须手动添加(创建)。
答案 0 :(得分:1)
您可以生成一个长的随机盐,将盐添加到密码中并使用标准的加密哈希函数(如SHA256)对其进行哈希处理。然后将salt和hash保存在用户的数据库记录中。永远不要存储明文密码!
当您想要验证用户的登录时,您需要做的就是从数据库中检索用户的salt和hash,将salt添加到给定的密码并使用相同的哈希函数对其进行哈希处理。然后将给定密码的哈希值与数据库中的哈希值进行比较。如果匹配,则密码正确。否则,密码不正确。
请勿:
答案 1 :(得分:1)
如果您真的担心服务器速度变慢,那么只需等到用户点击确认链接即可。然后让用户选择自己的密码并存储其哈希值。通过这种方式,您可以完全避免盐和哈希生成(对于虚假帐户),并且具有不必生成计算机密码的优势。
如果您从DEV_URANDOM读取(不使用DEV_RANDOM),那么您的服务器应该没有阻塞问题,并且不应该因为生成盐而减速。
请记住,还有其他方法可以减慢您的服务器速度,例如,攻击者可以使用登录表单来激发哈希计算。
顺便说一句,使用像password_hash()这样的适当函数,没有理由自己生成盐,这个函数会尽力生成安全的盐,它会使用慢键推导函数(BCrypt)应该用于密码(不是SHA- *甚至是MD5)。