我正在重写PHP登录系统,我只是面对这个
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = hash('sha256', $salt . $hash);
Actualy我以前从未使用盐腌,我搜索了一下,发现它很有用。
但我的回答是,这是一种使用盐的好方法吗?
不会$string = sha1(uniqid(mt_rand(), true))
更好吗?
那么只返回哈希的3个字符呢?我真的不明白。
你的想法是什么?
答案 0 :(得分:3)
考虑使用PHP的crypt()而不是重新发明轮子。它专门用于密码散列,并提供适合此目的的散列算法。
答案 1 :(得分:1)
我更喜欢sha1或sha256,md5超级过时,sha函数更好。但这是我的意见,选择你想要的东西。
在这种情况下真正重要的是盐。 salt始终以明文形式与散列一起存储,并用于改善密码的长度(如果您想要散列密码,当然可能是其他东西)以防止基于彩虹/查找表的攻击。这不能防止使用强力破解密码(这对md5很有效,所以使用更难破解的sha256)。
因此,如果你使用32个随机字符作为哈希,或者类似md5(mt_rand()),这完全不重要 - 重要的是长度。我会使用像
这样的东西$hash = md5(mt_rand()) . md5(mt_rand());
md5()导致32字节的字符串,基于随机数(mt_rand()优于uniqueid())。有了这个simpel系列,你就会获得一个非常“强大”的哈希,它应该保护每个密码不受彩虹表的影响。
答案 2 :(得分:0)
我不同意给定的函数createSalt()
- 主要是出于与您相同的原因。
我的方法是
define(SALT_LENGTH,32);
function createSalt()
{
$string='';
for ($i=0;$i<SALT_LENGTH;$i++) $string.=chr(rand(0,255));
return $string;
}
一个好的盐是一个随机的字节序列 - 没有MD5或SHA1有任何意义,因为没有什么要哈希!
答案 3 :(得分:0)
我没有掌握PHP程序员,但我一直在为登录系统开发相同的哈希脚本。
我将它存储在GitHub上 - https://github.com/revitalagency/PHP5-Salt-Super-Admin
我用...创建了哈希
hash_hmac('sha256', $_POST['pass'], GLOBAL_SALT);
GLOBAL_SALT在配置文件中定义,不在DB中以获得额外保护。