我已经为盐和胡椒密码加密创建了这段代码。我认为这是一种加密密码的好方法,但这是什么级别的加密?
我首先想到'bit'部分是使用的字符长度,但我知道这是不正确的。这会是多少位加密?
PHP
function _h() {
$result = "";
$charPool = '0123456789abcdefghijklmnopqrstuvwxyz';
for($p = 0; $p<32; $p++)
$result .= $charPool[mt_rand(0,strlen($charPool)-1)];
return md5(sha1(md5(sha1($result))));
}
$salt = _h();
$pepper = _h();
$pass = $salt.md5($salt.md5($_POST['password']).$pepper).$pepper;
更新
我知道这不是加密,所以我不能说这是加密的,而是哈希。是否有一个哈希密码,盐和胡椒的安全性足以保存密码?
答案 0 :(得分:3)
您的方案存在很多问题来散列密码。
PHP 5.5将自己的函数password_hash()和password_verify()准备好,以简化生成BCrypt密码哈希值。我强烈建议使用这个优秀的api,或者compatibility pack用于早期的PHP版本。用法非常简单:
// 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);
这些功能将解决以下问题:
辣椒不仅仅是第二种盐,与盐相比,辣椒是秘密的,不会与哈希一起储存。所有密码通常都使用相同的胡椒。
答案 1 :(得分:1)
将salt
和$peppr
的计算过于复杂化是没有用的。毕竟,任务不是检索最初用于生产这些香料的东西,而是追溯$_POST('a']
的价值而你赠送 $salt
和$pepper
作为前缀/后缀(否则您无法使用存储的valuelater 验证此哈希的输入密码)。话虽如此,请像@zneak一样评论并使用专家库函数。