密码安全一次又一次地进行散列或只是一次

时间:2014-04-11 20:25:12

标签: php security passwords password-encryption

使用以下方法存储密码更安全:

$password=hash(sha512, $_POST['password']);
$password=hash(sha512, $password);
$password=hash(sha256, $password);
$password=md5('JIOA#324FKJ///#dfr3inj1HJ4_jbbf-vbd31ds4_-_nURl//\&dffve@.add123456789fs-@drgko489d', $password);
$password=hash(sha512, $password);

这一切是否比仅仅更安全:

$password=hash(sha512, $_POST['password']);

2 个答案:

答案 0 :(得分:1)

不,因为 - 正如towr所指出的那样 - 第一个每次都返回相同的$password ,这显然不是你想要的。第二个是实用意图和以明文形式保存密码一样糟糕。有大量的在线数据库,您可以在其中查找特定哈希的密码。如果我们看看第一个代码打算做什么(我猜md5步骤是为了连接两个字符串)那么那就更好了,因为它使用md5步骤中的字符串作为salt。虽然盐是静态的,所以它仍然是一个非常糟糕的密码散列方案。您可能希望阅读一些password hashing basics

无论如何,我建议你关注ceejayoz'建议并使用PHP 5.5的password_hash函数。

答案 1 :(得分:0)

所有建议的散列方案都不适合散列密码,因为它们都太快了。您需要一个缓慢的密钥派生函数,如BCrypt或PBKDF2,具有适应性的成本因子。

PHP提供新函数password_hash来计算BCrypt哈希值。它简化了生成安全盐等所有棘手的事情。对于早期的PHP版本,您可以使用compatibility pack

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);