5

我正在使用 Adam Griffiths 的 CodeIgniter 身份验证库,并且正在调整用户模型。

我遇到了一个他用来生成令牌的生成函数。

他首选的方法是从 random.org 引用一个值,但我认为这是多余的。我正在使用他随机生成 20 个字符长字符串的后备方法:

$length = 20;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$token = '';    
for ($i = 0; $i < $length; $i++) {
 $token .= $characters[mt_rand(0, strlen($characters)-1)];
}

然后他使用盐对这个令牌进行哈希处理(我正在组合来自不同函数的代码)

sha1($this->CI->config->item('encryption_key').$str);

我想知道是否有任何理由通过加盐哈希运行令牌?

我读过简单地随机生成字符串是制作随机密码的一种天真的方式,但是 sh1 哈希和盐是必要的吗?

注意:我从https://www.grc.com/passwords.htm获得了我的加密密钥(63 个随机字母数字)

4

2 回答 2

7

加盐哈希用于减少冲突的可能性并确保在数据库中找不到哈希(像这样) - 如果每个人都使用md5()存储他们的密码,那么密码文件/数据库可以“去哈希” " 通过查找密码的 md5 值。

使用盐,散列中添加了一个未知元素,这意味着还必须知道生成盐的代码才能尝试暴力破解散列。在生成随机密码的上下文中,我看不到任何对哈希进行加盐的意义,因为密码数据无论如何都是随机的。

于 2010-03-19T20:45:01.897 回答
3

加盐哈希函数的主要原因是使字典攻击复杂化。加盐可以避免发现相同的密码,因为它们会产生相同的哈希值。

散列函数的另一个用途是在伪随机数生成器中——您的代码正在尝试这样做。

真正的随机性不是一件容易实现的事情,而伪随机生成可能会很棘手。您解释的代码似乎试图从 random.org 获得“最佳”随机性,它的后备伪生成正在尝试做正确的事情。

于 2010-03-19T21:12:55.593 回答