我想通过使用mysqli prepare语句搜索散列密码来从表中获取user_id。
我知道准备好的陈述是如何运作的,例如
$query = "SELECT `colour` FROM `pallet`";
$query.=" Where `colour`=? "
$stmt = $db->prepare($query);
$stmt->bind_param('s',$colour="blue");
$stmt->execute();
$stmt->bind_result($colour);
while($stmt->fetch())
snip
所以我对准备好的语句没有问题,但问题是这与我的哈希密码相匹配,我必须输入密码
$input_password = crypt($password,$database_pass);
并在匹配之前将其哈希。所以我想我会尝试这样的事情
$query = "SELECT `password` FROM `log`";
$query.=" Where `password`=? "
$stmt = $db->prepare($query);
$stmt->bind_param('s',crypt($password,$database_pass));
$stmt->execute();
$stmt->bind_result($colour);
显然这不起作用,因为我需要在绑定之前从数据库中获取$ database_pass。我想一气呵成。
在此之前,我没有使用准备好的表,我只是获取密码并在循环中检查它们,但我希望通过一次性完成所有操作来改善这一点。
我总是以一种方式解决问题,然后再尝试改进它,但我对这个方法有困难。
好的我已经设法以不同的方式做到了,但我的新代码的问题是它必须先阅读整个表才能进行比较。我宁愿用where子句来做,因为它只获取它需要的数据。
Global $db;
$query = "SELECT `temp_pass`,`user_id` FROM `".$database."`.`logon`";
$stmt = $db->prepare($query);
$stmt->execute();
$stmt->bind_result($temp_pass,$user_id);
while ($stmt->fetch()) {
$input_password = crypt($password,$temp_pass);
if($input_password == $temp_pass):
return $user_id;
break;
endif;
}
答案 0 :(得分:1)
人们无法在数据库中搜索正确的盐渍密码,问题就在于你所描述的:要计算一个可比较的密码哈希,你需要先得到盐,这是因为你找不到散列。
这适用于密码哈希,但是如果您有密码重置的强令牌,那么另一件事就是。如果令牌足够强大,您可以存储未加保证的哈希值(例如SHA-256)以及您可以在数据库中找到的哈希值。