我是否需要Salt和Hash随机生成的令牌?

时间:2010-03-19 20:34:49

标签: saltedhash

我正在使用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随机字母数字)

获得了我的encryption_key

2 个答案:

答案 0 :(得分:6)

Salting a hash用于降低冲突的可能性,并确保在数据库中找不到哈希值(如this) - 如果每个人都使用md5()来存储密码,然后通过查找密码的md5'd值来“解密”密码文件/数据库。

使用salt,哈希中添加了一个未知元素,这意味着还必须知道用于生成salt的代码并尝试强制哈希。在生成随机密码的上下文中,由于密码数据无论如何都是随机的,因此我看不出任何关于使用哈希值的问题。

答案 1 :(得分:3)

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

散列函数的另一个用途是在pseudo-random number generators中 - 您的代码正在尝试这样做。

True randomness并不容易实现,伪随机生成可能很棘手。您解释的代码似乎试图从random.org获得“最佳”随机性,并且它的后退伪生成试图做正确的事情。