我是否通过这种简单的密码腌制以正确的方式使登录系统安全?

时间:2012-11-04 10:49:46

标签: php salt

我在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()中,我有这种感觉,我只是让事情变得复杂,而这可能不会产生应有的安全盐。不管我走向正确的方向,有人都可以告诉我吗?

P.S。我对crypt函数有这样的想法。只是想知道我的代码好吗?

感谢。

2 个答案:

答案 0 :(得分:2)

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

简而言之,如果您不需要,请不要自己动手。

答案 1 :(得分:1)

这显然是一个安全问题:

uniqid(rand(),TRUE);

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

如果您选择一个好的PRNG所有其他盐(例如服务器名称,静态长盐,时间等)变得不相关。