2013-05-18 28 views
-1

我一直在寻找替代SHA1作为密码加密的可能bcrypt或类似的东西,我似乎无法找到一步一步,容易遵循教程来实现这一点。 我没有在YouTube上的快速教程,产生了以下代码:用BCRYPT代替SHA1

$username = 'myusername'; 
$password = 'pa55w0rd'; 

$str = substr($username, 0, 6); 
$salt = '$2a$12$rU8E3fsI9rsKh3V2'.$str.'$'; 
$pass = crypt($password, $salt); 

echo $salt . '<br>' . $pass; 

,当我运行在浏览器的代码,这样得到的输出:

$2a$12$rU8E3fsI9rsKh3V2myuser$ 
$2a$12$rU8E3fsI9rsKh3V2myuseeMSOT1BADLFs/ncqHx5aG2q953uqp.Tu 

问题1:

上午我正确地假设这两个字符串都是为用户生成的,并且这两个字符串都需要作为列“salt”和“pass”存储在例如users表中。

问题2:

为什么它看起来像用户名的一部分,是盐和传中可见?这是正常的,还是有一些额外的步骤,我需要采取消除这种情况发生?

问题3:

是这种方法的密码散列比MD5和SHA1更安全,或是否有更好的方法,我应该使用?

任何建议理解..

回答

1
  1. 否,该盐被存储为哈希密码的一部分。请注意,哈希是针对彩虹攻击(预先准备的哈希字典)或类似的。

    为了检查正确的密码,crypt函数可以哈希密码本身作为盐,它知道如何将盐从散分裂] 见:Comparing passwords with crypt() in PHP

  2. 不,这很好,见上面。

  3. SHA1比MD5更好更强,虽然最好使用SHA-2。

2

我建议使用PHP的新password_hashpassword_verify功能。

因为你可能没有PHP> = 5.5.0,所以有一个PHP implementation增加了对即将到来的函数对老版本PHP的支持。

更多信息:https://gist.github.com/nikic/3707231

+0

我有PHP 5.3.0 - 我应该升级到5.5,并使用这些功能呢?这是你推荐的吗?这些功能是否在幕后使用了bcrypt? –

+0

@ DJDonaL3000我链接的实现在PHP 5.3中运行良好,因此您不必升级。如果你在'password_hash'(第二个参数)中指定它,它使用bcrypt。 –

+0

链接的PHP实现在5.3.7+上运行。并且*可能*用于带有后端修复的实现。但是,如果您仍然使用5.3.0,我强烈建议尽可能升级到最新的5.3.x版本。 – PeeHaa