1

我在login表中有两个字段

  • 密码

我有这个小功能来生成盐

function random_salt($h_algo="sha512"){
        $salt1=uniqid(rand(),TRUE);
        $salt2=date("YmdHis").microtime(true);
        if(function_exists('dechex')){
            $salt2=dechex($salt2);
        }
        $salt3=$_SERVER['REMOTE_ADDR'];
        $salt=$salt1.$salt2.$salt3; 

        if(function_exists('hash')){
            $hash=(in_array($h_algo,hash_algos()))?$h_algo:"sha512";
            $randomsalt=hash($hash,md5($salt)); //returns 128 character long hash if sha512 algorithm is used.
        }else{
            $randomsalt=sha1(md5($salt)); //returns 40 characters long hash
        }

        return $randomsalt;
    }

现在要创建用户密码,我有以下内容

$userinput=$_POST["password"] //don't bother about escaping, i have done it in my real project.
$static_salt="THIS-3434-95456-IS-RANDOM-27883478274-SALT"; //some static hard to predict secret salt.
$salt=random_salt(); //generates 128 character long hash.
$password =sha1($salt.$userinput.$static_salt);

$salt保存在salt数据库的字段中,并$password保存在password字段中。

我的问题,在函数random_salt()中,我有这种感觉,我只是让事情变得复杂,而这可能不会产生应有的安全盐。无论我是否朝着正确的方向前进,有人可以给我一盏灯吗?

PS我确实对crypt功能有一个想法,就像这样。只想知道我的代码好吗?

谢谢。

4

2 回答 2

2

你真的应该看看这个问题/答案 ::
How do you use bcrypt for hashing passwords in PHP?

简而言之,如果不需要,请不要自行滚动。

于 2012-11-04T10:59:42.050 回答
1

这显然是一个安全问题:

uniqid(rand(),TRUE);

你是如何为 rand(). 设置种子的?你在哪里熵池?只要你不能回答,盐就必须被认为是可预测的。请记住:安全性并非来自代码晦涩难懂。

如果您选择了一个好的 PRNG,所有其他的盐(例如服务器名称、静态长盐、时间等)都会变得无关紧要。

于 2012-11-04T10:59:04.833 回答