正确创建盐渍哈希密码的方法

时间:2014-07-21 10:07:01

标签: php security hash salt saltedhash

我是新手在数据库中存储密码,从我读到的内容我创建了一个简单的PHP脚本

<?php
  $salt =  openssl_random_pseudo_bytes (16);
  $password = "test";
  $hash = hash ("sha512" , $salt . $password);

  echo $hash;
?>
  1. 我这样做是否正确?
  2. 盐应该以字节数据类型存储在数据库中吗?
  3. 最终的哈希应该存储在数据库中的String数据类型吗?

3 个答案:

答案 0 :(得分:1)

如果您正在运行(PHP 5 >= 5.5.0),那么您可以利用内置的php密码哈希功能。

简单用法:

$options = [
    'cost' => 11,
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), // or your own salt here
];

$pass_hash = password_hash("helloworld", PASSWORD_BCRYPT, $options);

if (password_verify('helloworld', $pass_hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

答案 1 :(得分:1)

SHA *算法不适合散列密码,因为它们的速度太快,因此可能过于强制。相反,应该使用像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);

建议你传递自己的盐,而是让该函数从操作系统的随机源创建一个加密安全的盐。

salt将包含在生成的哈希值中,因此您不必单独存储它。只需在数据库中创建一个60个字符的字符串字段并存储哈希值。函数password_verify()将从存储的哈希值中提取使用过的salt。有关详细信息,请查看我的storing passwords教程。

答案 2 :(得分:-2)

通常我用散列密码存储盐。我有自己的格式来识别散列密码的盐。例如,散列密码是2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824,盐是aaabbb。我将盐附加到哈希密码,如2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824aaabbb。所以我可以认识到最后6个字是这个哈希密码的盐。即使数据库被黑客入侵,他们仍然不知道盐和真实密码。