0

我正在重写一个 PHP 登录系统,而我刚刚遇到了这个问题

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}
$salt = createSalt();
$hash = hash('sha256', $salt . $hash);

实际上我以前从未使用过盐渍,我搜索了一下,发现它很有用。但我的回答是,这是处理盐的好方法吗?不会$string = sha1(uniqid(mt_rand(), true))更好吗?

如果只返回 3 个字符的哈希值呢?我真的不明白。

你认为呢?

4

4 回答 4

3

考虑使用 PHP 的crypt()而不是重新发明轮子。它专为密码散列而设计,并提供适合该目的的散列算法。

于 2012-06-06T19:06:53.520 回答
1

我更喜欢 sha1 或 sha256,md5 超级过时,sha 功能要好得多。但这是我的意见,选择你想要的。

在这种情况下,真正重要的是盐。盐总是与散列一起以明文形式存储,用于提高密码的长度(如果你想散列密码,当然可能是别的东西)以防止基于彩虹/查找表的攻击。这不能防止使用暴力破解密码(它对 md5 非常有效,所以使用更难破解的 sha256)。

因此,如果您使用 32 个随机字符作为散列,或者类似 md5(mt_rand()) 之类的东西,这完全不重要——重要的是长度。我会使用类似的东西

$hash = md5(mt_rand()) . md5(mt_rand());

md5() 基于随机数生成 32 个字节的字符串(mt_rand() 优于 uniqueid())。使用这条简单的线,您将获得一个非常“强”的哈希,它应该保护每个密码免受彩虹表的影响。

于 2012-06-06T21:28:21.893 回答
0

我不是 PHP 程序员,但我一直在为登录系统编写相同的哈希脚本。

我将它存储在 GitHub 上 - https://github.com/revitalagency/PHP5-Salt-Super-Admin

我使用...创建了我的哈希

hash_hmac('sha256', $_POST['pass'], GLOBAL_SALT);

GLOBAL_SALT 在配置文件中定义,而不是在数据库中以提供额外保护。

于 2012-08-15T01:05:26.077 回答
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 没有任何意义,因为没有什么可以散列!

于 2012-06-06T19:03:32.743 回答