【问题标题】:Implementing password hashing/salting algorithm from crackstation.net从crackstation.net 实现密码散列/加盐算法
【发布时间】:2012-07-11 02:59:28
【问题描述】:

我正在尝试从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){
}

当然,另一种更好的方法也同样有帮助。 谢谢

【问题讨论】:

  • 我假设 $good_hash 是存储的散列密码,$password 是为登录提交的原始密码
  • 不要扮演自己的角色,使用PHPass
  • 两个 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 Password Hashing FAQ

标签: php security passwords hash salt


【解决方案1】:

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

【讨论】:

  • 所以我只是检索存储在数据库中的哈希,并使用从 $_POST 获得的原始密码传递它。太明显了,小子我现在是不是觉得很傻。