问题描述
|
我正在测试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
哪个更好,或者可以使用其他东西?如果是,那该怎么办?
解决方法
散列哈希不会增加额外的安全性。 (实际上,如果此人具有哈希表查找表,可能会变得更糟。)
最佳哈希将是计算上执行起来最昂贵,没有任何漏洞的哈希。我会用至少sha-256哈希密码。
始终使用加盐键对密码进行哈希处理。该密钥对于每个密码应该是唯一的。它不需要私有存储。固定密码的目的是,获得您数据库访问权限的黑客不能简单地将哈希与已知的与普通密码相对应的哈希列表进行比较。相反,他必须尝试通过尝试所有可能的密码来强行使用密码。
通过为每个密码使用唯一的盐,即使它们使用相同的密码,也可以确保数据库中的每个哈希都不同。
要添加密码,只需创建一个随机字符字符串并将其附加到密码上即可。这是带有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),0xffff)));
return $salt.hash(\'sha256\',$salt.$password);
}
function check_password($password,$hash)
{
$salt = substr($hash,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或较强的哈希算法。但至少,我会使用类似上面的内容。
,它们都是仅以1向方式操作的加密哈希函数,主要区别在于MD5的输出大小为128位,而SHA-1为160位。简而言之,尽管最近MD5更为常见,但我认为它们的使用并没有太大不同。
奇怪的是,当它们全部加密为32个字符长的字符串时,我真的看不到md5($ text)与md5(sha($ text))有何不同,md5($ text)又如何呢? ) 例如?
而且,您所说的更好意味着什么?它看起来更美观还是更安全?如果您更喜欢安全性,请参见bcrypt :) Wikipedia:http://en.wikipedia.org/wiki/Bcrypt
,您应该总是对密码加盐。这并不能通过登录表单来阻止暴力破解,但是如果有人设法获取详细信息,则破解起来会困难得多(除非彩虹表也设法使您吃惊,否则它将毫无用处)
本质上,如果您添加原始数据或以受控方式进行处理,则可以使安全性好一些。没有人可以反转哈希,但是他们可以找到与哈希匹配的其他输入。修改用户输入将使黑客更难登录。
例如,如果用户的通行证是123456,则如果向其添加\“ salt \”的盐使其变为123456salt,则其MD5将为207acd61a3c1bd506d7e9a4535359f8a。黑客可能会将其破解为123456salt,但在登录表单上使用该密码时,您的代码将再次加盐,并且登录将失败。