我是新手在数据库中存储密码,从我读到的内容我创建了一个简单的PHP脚本
<?php
$salt = openssl_random_pseudo_bytes (16);
$password = "test";
$hash = hash ("sha512" , $salt . $password);
echo $hash;
?>
答案 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个字是这个哈希密码的盐。即使数据库被黑客入侵,他们仍然不知道盐和真实密码。