0

我最近才开始研究密码加密。我当前的代码如下所示:

<?php
define('salt','7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H=4cD0');
$password = "CatsRsoCool47";
$myHash = hash( 'whirlpool',salt.$password );

echo $myHash;
?>

如何检查用户输入的密码是否正确?我假设有某种内置函数接受盐、哈希和加密方法的参数并返回一个布尔值。

另外,产生盐的最安全方法是什么?我目前的盐是静态的,对每个用户来说都是一样的。我应该做类似的事情吗

$salt = Time()+'7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H';

如果这样做,我是否不必为每个用户将时间戳存储在数据库中。这不是安全漏洞吗?

我迷路了....请建议散列和检查密码的最佳方法。一个脚本会很好看:) 这个问题也可能是重复的,如果是这样,我很抱歉

4

1 回答 1

1

基本上,当输入密码时,无论您如何存储密码,您都使用应用于输入密码的相同内容。

然后您可以检查两个盐+哈希值是否相同。

就这么简单——对两个密码做同样的事情,你应该得到相同的结果。

您担心每次都使用相同的盐是对的。你真正想做的是每次使用不同的盐。然后,您可以将盐与密码一起存储。这听起来违反直觉,但这完全没问题。拥有盐不允许您反转哈希,因为该过程无论如何都是不可逆的。

然后,当您想检查密码时,您查找用户,获取他们的盐,使用它来应用哈希,然后根据他们存储的哈希检查您最终得到的结果。

例如(使用恒定盐),您可能有类似的东西:

<?php
define('salt','7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H=4cD0');

$incomingPassword = $_POST['password'];
$storedHash = getStoredHash( $_POST['username'] );

$incomingHash = hash( 'whirlpool',salt.$incomingPassword );

if ( $incomingHash == $storedHash ) {
  echo('Passwords match!');
}

?>

希望很容易看出如何将这种技术与移动的盐一起使用。

注意 - 这不是加密 - 重点是该方法是一种方式。您生成的内容无法用于检索实际密码。加密意味着该过程是可逆的。

对散列密码的攻击是通过所谓的“彩虹表”完成的。

攻击者使用您使用的相同技术构建一个可能的密码表以及相应的哈希值。然后将该表与您存储的密码进行比较。当存在匹配时,攻击者可以推断为该行存储的密码。

使用单一的盐使这更容易,因为每个密码的技术都是相同的。如果你每行使用不同的盐,那么该技术有一个随机因素,这意味着攻击者需要一个更大的彩虹表来攻击你——基本上每行一个全尺寸的表。

于 2014-04-06T22:50:59.807 回答