php盐认证
感谢您对我对php/mysql的无知提出的真诚批评,我感谢您在这个问题上的帮助 在做了下面建议的更正之后,我遇到了注册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
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服务器配置为这样做,您可以使用双引号引用标识符。这不是默认行为,但也是可能的。