我最近刚开始研究密码加密。 我目前的代码如下:
<?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,hash和加密方法的参数并返回一个布尔值。
另外,最安全的生盐方法是什么?我现有的盐是静态的,每个用户都是一样的。我应该做点什么吗
$salt = Time()+'7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H';
如果这样做,我不必每个用户在数据库中存储时间戳。这不是一个安全漏洞吗?
我迷路了....请建议散列和检查密码的最佳方法。一个脚本会很好看:)这个问题也可能是重复的,如果是的话我很抱歉
答案 0 :(得分:1)
基本上,当密码进入时,无论您如何存储密码,都会使用与传入密码相同的内容。
然后,您可以检查两个salt +哈希值是否相同。
这很简单 - 对两个密码做同样的事情,你应该得到相同的结果。
你每次都担心使用同样的盐是正确的。你真正想要的是每次使用不同的盐。然后,您可以将盐与密码一起存储。这听起来很直观,但这完全没问题。由于过程不是可逆的,所以盐不允许你反转哈希值。
然后,当您想要检查密码时,您会查找用户,获取他们的盐,使用它来应用哈希值,然后检查您最终的存储哈希值。
例如(使用常量盐),您可能会有:
<?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!');
}
&GT;
希望您很容易看到如何将这种技术与移动的盐一起使用。
注意 - 这不是加密 - 重点是方法是单向的。您生成无法用于检索实际密码的内容。加密意味着该过程是可逆的。
对散列密码的攻击是通过所谓的“彩虹表”进行的。
攻击者使用您使用的相同技术在其对应的哈希值旁边构建可能的密码表。然后将此表与存储的密码进行比较。如果匹配,则攻击者可以推断为该行存储的密码。
使用单一盐可以使这更容易,因为每种密码的技术都相同。如果你每行使用不同的盐,那么该技术有一个随机因素,这意味着攻击者需要一个更大的彩虹表来攻击你 - 基本上每行一个完整大小的表。