2012-07-11 149 views
2

我试图从crackstation.net实现密码散列/腌制算法,但我不确定如何实现它。从crackstation.net实现密码散列/腌制算法

在用户注册时存储密码似乎与将密码传递到create_hash()一样简单。

$password = create_hash($_POST['Password']; 

我不是跟随如何验证用户登录。 validate_password($ password,$ good_hash)返回true或false,并将$ password作为参数,所以除了第二个参数$ good_hash之外,它看起来似乎没有什么意思。这个参数来自哪里?

我的理解是,密码在每次使用时变成散列值,并且散列值是存储和比较的值。那么为什么我会同时拥有$ password和$ good_hash值呢?

的功能快速浏览:

function create_hash($password){ 
    calls pbkdf2() 
} 

function validate_password($password, $good_hash){ 
    calls pbkdf2() 
    calls slow_equals() 
} 

function slow_equals($a, $b){ 
} 

function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false){ 
} 

当然这种不同的,更好的方法也将是一种有益的。 谢谢

+1

我会假设$ good_hash是存储的散列密码,并且$ password是提交登录的原始密码 – 2012-07-11 03:17:15

+0

不要自己扮演角色,请使用[PHPass](http://stackoverflow.com/questions/1581610/how-我的用户密码安全/ 1581919#1581919) – Jacco 2012-07-12 10:48:32

+1

两个PBKDF2注意事项:首先,尽可能使用高迭代次数,并在峰值负载期间保持足够的性能。其次,永远不要求比本机散列更多的输出长度(SHA-1是20字节,SHA-224是28字节,SHA-256是32字节,SHA-384是48字节,而SHA-512是64字节)。一种不同的方法是password_hash()和password_verify(),从5.5开始可以在PHP中使用,并且从5.3.7开始使用兼容性库,每个[PHP.net密码散列常见问题](http://www.php.net/manual /en/faq.passwords.php)。 – 2014-03-25 02:51:58

回答

2

good_hash此时已经存储在数据库中,并且是已知的“良好散列”。从数据库中检索并将其与password进行比较,该用户已被提交,现在已经使用相同算法进行散列处理。

+0

因此,我只是检索存储在数据库中的散列,并使用从$ _POST获取的原始密码传递它。很明显,男孩现在感觉很傻。 – Mason240 2012-07-11 03:23:58