我要在我的网站上使用sha256,以保护我的用户密码,并且我正在考虑使用用户id(int auto_increment)。这将是独一无二的,但不是很长很难,而且是公共的(user.php?id = 1),但它的独特之处是否重要?
hash('sha256', $id . $password);
答案 0 :(得分:8)
是的,重要的是盐是独特的(碰撞不太可能),但它也应该有足够的熵(随机和足够长)。用户ID不是随机的,可能太短,所以最好的办法是使用随机生成的字符串并将它们与哈希一起存储在数据库中。
假设具有UID 9
的用户选择了一个愚蠢的密码:password
。然后,将被散列的结果字符串可以是9password
。您可以想象,即使在这种情况下,完整字符串也可能出现在rainbow tables中(包含大量哈希及其原始字符串的表格)。
如果这种情况下的盐是OTAzMzYzODQzMjk5NTM1NDc1N
,那么要散列的字符串是OTAzMzYzODQzMjk5NTM1NDc1Npassword
,这在彩虹表中更不可能出现。此外,输入字符串更长,减少了暴力攻击的风险。
答案 1 :(得分:2)
这可行,但使用salt的目的是区分散列键以加强crypt算法。使用独特的,随机生成的/时间盐渍的盐用于盐会更好。最好不要在同一个表中包含salt和hash键。
答案 2 :(得分:0)
你的盐不容易猜到。在其中一种更基本的形式中,您可以使用
基于当前的TIMESTAMP创建一个盐 date('U')
由于其长度,唯一性以及将其存储在数据库中并且不公开可用的事实而更加安全。然后你会以这样的方式使用它:
$hash = date('U');
$pass = hash('sha256', $hash . $password);
就登录时检查密码而言:
// return query object based on matching email/username
if ($userobj->pass === hash('sha256', $userobj->salt .$_POST['pass'])) {
// correct pass
}
答案 3 :(得分:0)
我不认为这是一个不错的选择:我会使用更随机的盐将其保存到用户记录中。 也许在密码字段中保存此字符串:sha256($ password。$ randomSalt)。 '$'。 $ randomSalt
这样你就可以在登录时检索盐来检查密码。
(无论如何,你还可以使用另一个字段来单独使用盐)