0

我已经为盐和胡椒密码加密创建了这个代码。我认为这是加密密码的好方法,但这是什么级别的加密?

我首先认为“位”部分是使用的字符长度,但我知道这是不正确的。这将是多少位加密?

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;

更新

我知道这不是加密,所以我不能说这是加密的,而是散列。带有盐和胡椒的散列密码是否足够安全以保存密码?

4

2 回答 2

3

您的密码哈希方案存在很多问题。

PHP 5.5 将有自己的函数 password_hash() 和 password_verify() 准备好,以简化生成 BCrypt 密码哈希。我强烈推荐使用这个优秀的 api,或者它是早期 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. 他们使用慢速自适应散列函数 (BCrypt),MD5 对于散列密码来说太快了。
  2. 它们从操作系统的随机来源生成安全盐。

胡椒不仅仅是第二种盐,与盐相比,胡椒是秘密的,不会与哈希一起储存。所有密码通常使用相同的辣椒。

于 2013-03-09T22:19:03.020 回答
1

过多的计算复杂salt化是没有用的。$peppr毕竟,任务不是检索最初用于生产这些香料的东西,而是取回 of 的值,然后将$_POST('a']and作为$salt前缀$pepper/后缀(否则你不能使用存储的值来验证输入密码)这个哈希)。话虽如此,请按照@zneak 的评论进行操作并使用专家库功能。

于 2013-03-09T17:01:02.213 回答