2013-03-29 107 views
2

在我开始之前,我很想再次提出这个问题,因为很多用户都这样做了,但是通过我做的一项研究,我对我的发现并不满意。我只是希望在这里提出一些真正有用的东西。PHP密码保护足够安全

由于MD5或SHA-1被认为是不好的做法(即使使用盐时???),我试图对散列我的密码

$password = $_POST['password']; // lets say that my password is: [email protected] 
function encrypt_the_password($password){ 
    $salt = "[email protected]@d1p1sc1ng3lit"; 
    return hash('sha256', $salt.$password);// can use also different algorithm like sha512 or whirlpool 
} 
$hashed_password = encrypt_the_password($password); 

注意,这一个我用它在个人创建此功能只有一个用户的网站,我。在有一个以上的用户的情况下,我想出了这样的事情:

$password = $_POST['password']; 
function generate_salt() { 
    $salt = uniqid(md5("[email protected]@d1p1sc1ng3lit".microtime())); 
    $salt = hash('sha256', $salt);// can use also different algorithm like sha512 or whirlpool 
    return $salt; 
} 
function encrypt_the_password($password,$salt){ 
    return hash('sha256', $salt.$password);// can use also different algorithm like sha512 or whirlpool 
} 
$hashed_password = encrypt_the_password($password,generate_salt()); 

这是足够安全(在每种情况下),或者可以在此改善更???


我编辑:我试图想出一些新的使用crypt()函数。这是我在具有只有一个用户,管理一个网站的情况下,代码:

$password = $_POST['password']; 
$salt = "L0r3mIpsUmD0l0rS1tAm3t"; 
$hashed_password = crypt($password', '$2a$12$' . $salt); 

,并在有一个以上的用户现场的情况:

$password = $_POST['password']; 
function generate_salt() { 
     $salt = uniqid(sha1("L0r3mIpsUmD0l0rS1tAm3tc0ns3CT3tur4d1p1sc1ng3lit".microtime())); 
     $salt = substr(sha1($salt), 0, 22); 
     return $salt; 
} 
$hashed_password = crypt($password', '$2a$12$' . generate_salt()); 

这是正确的,或者需要改进? ??

回答

6

改进它不通过自己的算法。你的算法是不安全的,因为你的盐是不变的,你只需要一次SHA256迭代,这在计算上便宜。

取而代之,使用Bcrypt,这既计算成本昂贵,又由知道自己在做什么的人验证,所以它比您的解决方案更安全。

+0

如何添加迭代到这?我不明白。我的意思是,如果我迭代sha256 1000次,是不是总是返回相同的散列字符串? – Lykos

+0

@Lykos:你*不*添加迭代。我只是指出你为什么散列不好。 *不要使你自己的密码哈希函数*。使用Bcrypt或pbkdf2。 – Blender

+0

Bcrypt与crypt()相同? – Lykos

3

您应该使用PHP 5.5中内置的密码功能。 ircmaxell提供了一个后备库,可以提供早期版本的PHP中的功能:https://github.com/ircmaxell/password_compat

它将始终使用最新的散列技术,并且甚至为您更新记录。确保您阅读随此库一起提供的自述文件。

不要做你自己的散列函数。