php盐认证

php盐认证,php,authentication,passwords,salt,Php,Authentication,Passwords,Salt,感谢您对我对php/mysql的无知提出的真诚批评,我感谢您在这个问题上的帮助 在做了下面建议的更正之后,我遇到了注册 sha1(md5($password).$salt) 与登录身份验证相比,不是=== sha1(md5($password).$row['salt']); 所以我创建了一个脚本来查看登录脚本所看到的内容,并将两者进行比较 $query = "UPDATE `users` SET `form_password` = '$encrypted' WHERE `userna

感谢您对我对php/mysql的无知提出的真诚批评,我感谢您在这个问题上的帮助

在做了下面建议的更正之后,我遇到了注册

sha1(md5($password).$salt) 
与登录身份验证相比,不是===

sha1(md5($password).$row['salt']); 
所以我创建了一个脚本来查看登录脚本所看到的内容,并将两者进行比较

 $query = "UPDATE `users` SET `form_password` = '$encrypted'  WHERE `username` = '$username'";  
     mysql_query($query) or die (mysql_error());
密码注册为“1FCB4BDEB8A98151F5F74A2AF0B50455EC277C501”

并被称为“f2c04d2583f111fcd41288dc75901f6c870cfc6b”

以下是登录时更新的脚本:

else {  

$password = $_POST['password'];
$username = mysql_real_escape_string($_POST['username']);


$sql  =  "SELECT `password`, `salt` FROM `users` WHERE `username` = '$username' LIMIT 0,1";
$result = mysql_query($sql) or die(mysql_error());

if (is_resource($result) && mysql_num_rows($result) > 0){
    $row        =   mysql_fetch_array($result);
    $encrypted  =   sha1(md5($password).$row['salt']);

     if($encrypted === $row['password']){
    header('Location: page3.php');
    exit;
     } else{

     $query = "UPDATE `users` SET `form_password` = '$encrypted'  WHERE `username` = '$username'";  
     mysql_query($query) or die (mysql_error());

    header('Location: page2.php');
    exit;
     }
} else{
header('Location: page4.php');
exit;
}
}
a) 数据库中的密码字段有多大?SHA1散列长度为40个字符,因此,如果字段大小小于40个字符,则散列密码将被截断

b) 将
或die()
放在
$sql=…
行上是没有意义的。创建字符串不太可能失败。您需要将
或die()
放在实际执行查询的行上:

$sql = "..."
$result = mysql_query($sql) or die(...);
c) 您的代码容易受到sql注入的攻击,因为您将用户提供的用户名和密码直接粘贴到查询中而无需转义

d) 您不会检查获取用户pw/salt的查询是否成功。如果用户名不正确,查询将检索不到任何行。这不是一个错误条件,因为查询执行了它应该执行的操作。您需要通过
mysql\u num\u rows($result)
检查查询是否返回了一行。

a)您的密码字段在数据库中有多大?SHA1散列长度为40个字符,因此,如果字段大小小于40个字符,则散列密码将被截断

b) 将
或die()
放在
$sql=…
行上是没有意义的。创建字符串不太可能失败。您需要将
或die()
放在实际执行查询的行上:

$sql = "..."
$result = mysql_query($sql) or die(...);
c) 您的代码容易受到sql注入的攻击,因为您将用户提供的用户名和密码直接粘贴到查询中而无需转义


d) 您不会检查获取用户pw/salt的查询是否成功。如果用户名不正确,查询将检索不到任何行。这不是一个错误条件,因为查询执行了它应该执行的操作。您需要通过
mysql\u num\u rows($result)
检查查询是否返回了行。

您引用的列标识符不正确。使用反勾号或完全不使用

SELECT 'salt' FROM table WHERE ....
将返回“salt”。改用:

SELECT `salt` ....


请同时考虑Marc B提出的观点。它们都是好的和有效的。

您引用的列标识符不正确。使用反勾号或完全不使用

SELECT 'salt' FROM table WHERE ....
将返回“salt”。改用:

SELECT `salt` ....

请同时考虑Marc B提出的观点。它们都是好的和有效的。

你有很多错误

这是您的工作代码: db密码加密为:

你把很多事情搞错了

这是您的工作代码: db密码加密为:


我会用伪代码来做这件事

$salt='secretword';// that do not change
$encrypted=sha1($password.$salt);

INSERT INTO users (username,password) VALUES($username, $encrypted);
后来


注意:加密应该在php中完成,因为MySQL在匹配时会为每一行计算SHA1(..),这是不必要的浪费

$salt='secretword';// that do not change
$encrypted=sha1($password.$salt);

INSERT INTO users (username,password) VALUES($username, $encrypted);
后来


注意:加密应该在php中完成,因为MySQL在匹配时会为每一行计算SHA1(..),这是不必要的浪费

在安全性方面,“艰难学习”肯定是错误的方法。
SHA1(md5())
?是什么让你认为组合两个弱散列会导致除弱散列之外的任何结果?在安全性方面,“艰难学习”肯定是错误的方法。
sha1(md5())
?是什么让你认为组合两个弱散列会产生除弱散列以外的任何结果?好的,我错过了。这肯定会破坏函数,因为他将获得一个常量
密码
salt
,而不是存储的pw/salt值。此外,如果您愿意,并且您的mysql服务器配置为这样做,您可以使用双引号引用标识符。这不是默认行为,但它是可能的。好的,我错过了。这肯定会破坏函数,因为他将获得一个常量
密码
salt
,而不是存储的pw/salt值。此外,如果您愿意,并且您的mysql服务器配置为这样做,您可以使用双引号引用标识符。这不是默认行为,但也是可能的。