我在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
函数有这样的想法。只是想知道我的代码好吗?
感谢。
答案 0 :(得分:2)
你真的应该看看这个问题/答案:
How do you use bcrypt for hashing passwords in PHP?
简而言之,如果您不需要,请不要自己动手。
答案 1 :(得分:1)
这显然是一个安全问题:
uniqid(rand(),TRUE);
你是如何为rand()设置种子的?你在哪里熵池?
只要你不能回答盐就必须被认为是可预测的。请记住:安全性不是来自代码模糊。
如果您选择一个好的PRNG所有其他盐(例如服务器名称,静态长盐,时间等)变得不相关。