我有一个关于密码哈希的问题。我在http://crackstation.net/hashing-security.htm上找到了一个很棒的教程。这就是我使用以下代码从密码创建哈希的方式:
$hashed_password = create_hash(form_password);
这段代码的问题在于它每次都会为相同的密码创建不同的哈希值。我猜这是因为在密码中添加了随机盐:
function create_hash($password)
{
// format: algorithm:iterations:salt:hash
$salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" . $salt . ":" .
base64_encode(pbkdf2(
PBKDF2_HASH_ALGORITHM,
$password,
$salt,
PBKDF2_ITERATIONS,
PBKDF2_HASH_BYTES,
true
));
}
因此,由于这个原因,我无法将用户在登录时输入的密码创建的哈希值与从数据库中检索到的哈希值进行比较,因为该哈希值永远不会与存储在数据库中的哈希值相同。我认为可以做到的唯一方法是将盐存储在另一列中,还是我错了?
还有一件事让我很烦。hast 的格式为例如 sha256:1000:u9p+OqAZgVkIBtlTBkr9ZxhFvtt+zjcA:PvhJY+oesrdBeD5pjeXMQ/3wficCU0EG。黑客显然知道这种形式的哈希,所以创建这种哈希的算法对他来说是清楚的。让我们假设数据库已被入侵,并且有数千个这样的哈希码被泄露。这种形式的哈希码不会引发安全问题吗?我想一个简单的 OqAZgVkIBtlTBkr9ZxhFvtt+zjcA:PvhJY+oesrdBeD5pjeXMQ/3wfic 会更好,因为它没有透露任何关于加密机制的信息。