登录系统哈希盐

时间:2012-06-06 18:55:36

标签: php security login hash salt

我正在重写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个字符呢?我真的不明白。

你的想法是什么?

4 个答案:

答案 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中以获得额外保护。