1

我一直在尝试了解存储在带有 mysql 数据库的用户表中的哈希和盐。我完成了存储它们,但似乎无法理解如何验证用户何时登录。
我已经查看并看到了单独和一起存储盐和哈希。我生产的盐是随机的。

有任何想法吗?
我已经发布了我的代码。

<?php
$password = 'passwordwhatever';

//generate the salt
function gen_salt() {
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true));
    $salt = crypt('sha512', $salt);
    return $salt;
}

//generate the hash
function gen_hash($salt, $password) {
    $hash = $salt . $password;
    for($i = 0; $i < 100000; $i++) {
        $hash = crypt('sha512', $hash);
    }

    $hash = $salt . $hash;
    return $hash;
}

$password = gen_hash(gen_salt(), $password);
echo $password;

?>
4

3 回答 3

2

只要您生产相同的盐,就没有太大关系。将其存储在您的数据库中,在配置中,只要您可以访问它。反转 SHA512 哈希的工作量非常大,除非你是五角大楼,否则没人会打扰。关键是您希望能够使用相同的盐重复哈希,这样您就可以非常确定输入是相同的,而不必存储敏感输入。如果这是有道理的。

于 2012-06-05T00:51:20.807 回答
1

盐需要包含在数据库中的某处(或某处)。一些选项是将盐附加到哈希或存储为自己的字段。我喜欢将它附加到哈希中。

$password = $salt . '.' . $hash;

然后当用户登录时,您获取他的密码,将其分解为哈希和盐,并使用您的密码生成功能(使用密码中的盐而不是随机盐)来确定它是否与密码中的密码匹配D b。

list($salt,$hash) = explode('.', $password);
$check = gen_hash($salt, $input_pass);
if ($check === $password)
    // valid
于 2012-06-05T00:48:43.180 回答
0

也许你应该看看bcrypt可能会帮助你。我写了一些教程,但它们是德语的。哦,PHP 5.3 原生支持 bcrypt。

于 2012-06-05T00:51:43.973 回答