php用户密码保护


php users passwords protection

我正在测试sha1和md5:的几个组合

<?php
$test = 'fail test';
echo nl2br ("Text: $test'n");
echo nl2br ("md5: ".md5($test)."'nsha1: ".sha1($test)."'nsha1(md5): ".sha1(md5($test))."'nmd5(sha1): ".md5(sha1($test)));
?>

输出:

Text: fail test
md5: 748410d0085967c496d54dd8fcbecc96
sha1: d730125e8cb8576459173655148fb6896ef44c09
sha1(md5): faa3ebeecfec45e509e93e6b245a69e2a78785ea
md5(sha1): b48e89b85c350c91eb302c1de96d4249

哪一个更好,或者可能是用户其他的东西?如果是,那怎么办?

这两个函数都是仅单向操作的加密哈希函数,主要区别在于MD5输出大小为128位,而SHA-1为160位。简言之,尽管MD5现在更常见,但我看不出它们的使用有多大不同。

奇怪的是,当它们都加密到一个32个字符长的字符串时,我真的看不出md5($text)和md5(sha($text?

你说的更好是什么意思?它是更好看还是更安全?如果您喜欢安全性,请参阅bcrypt:)维基百科:http://en.wikipedia.org/wiki/Bcrypt

哈希不会增加额外的安全性。(事实上,如果这个人有哈希查找表的哈希,情况可能会更糟。)

最好的散列将是在没有任何漏洞的情况下执行计算成本最高的散列。我至少会用sha-256来散列密码。

始终使用带盐的密钥对您的密码进行散列。每个密码的密钥都应该是唯一的。它不需要私人存储。盐水密码的目的是,访问您数据库的黑客不能简单地将哈希与对应于常见密码的已知哈希列表进行比较。相反,他必须尝试通过尝试所有可能的密码来强行破解密码。

通过对每个密码使用唯一的salt,可以保证数据库中的每个哈希都是不同的,即使它们使用相同的密码。

要对密码进行加盐处理,只需创建一个随机字符串并将其附加到密码中即可。这是一个48位盐和sha-256:的哈希示例

function make_password($password)
{
  # random 48-bit salt (8 chars when base64 encoded)
  $salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff)));
  return $salt.hash('sha256', $salt.$password);
}
function check_password($password, $hash)
{
  $salt = substr($hash, 0, 8);
  return hash('sha256', $salt.$password) == substr($hash, 8);
}
$password = 'password';
$hash = make_password('password');
echo $hash."'n";
var_dump(check_password('password', $hash));
var_dump(check_password('wrong', $hash));

每次运行它时,哈希都会有所不同。要验证密码,请选择用户名匹配的行,然后调用check_password($password_from_user, $hash_from_db)

以下是输出示例:

AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496
bool(true)
bool(false)

如果您愿意,可以使用更大的salt或更强的哈希算法。但至少,我会使用类似上面的东西。

您应该始终对密码进行加密。这并不能阻止通过登录表单进行暴力攻击,但如果有人设法获得了详细信息,就更难破解(彩虹表将毫无用处,除非他们也设法获得你的盐)

从本质上讲,如果你以可控的方式添加到原始数据上或进行篡改,这将使安全性提高一点。没有人可以反转哈希,但他们可以找到与哈希匹配的其他输入。篡改用户输入将使黑客更难登录。

例如,如果用户的通行证是123456,如果您向其添加一个"salt"的salt,使其成为123456salt,则其MD5将是207acd61a3c1bd506d7e9a4535359f8a。黑客可以破解它,使其成为123456salt,但当在登录表单上使用它时,您的代码会再次添加salt,登录将失败。