我尝试为我的程序提供最好的密码安全性,经过一些研究,所有道路似乎都以PHPASS结束作为我的最佳选择。我正在做一些实验性试验,以了解我在做什么。 lol不太好lol尽管我可以看到PHPASS在密码中添加一个随机盐然后哈希它然后它可以存储在数据库中,用户现在已注册!。这对我来说很好。这部分我不喜欢不明白,当用户登录时,我从数据库中检索哈希并将其与用户在登录中输入的密码进行比较,但这次新哈希是不同的,因为它已经被创建了来自不同的盐?并且那里与存储在DB中的那个不匹配。在某些地方我是愚蠢的,并且遗漏了一些显而易见的其他人都得到的东西。请帮助我,因为我似乎迟钝了!
答案 0 :(得分:2)
是的,这是一个很好用的库。如果你有PHP 5.5+,则没有必要,因为内置了类似的功能。
使用$hasher->CheckPassword($pass, $hash)
检查密码,而不是重新密码。这样它就可以确保它使用相同的盐(盐存储在哈希的开头,就像哈希算法一样)。
答案 1 :(得分:1)
PHPASS返回一个散列,其中包含用于计算散列的算法,散列的成本,使用的 salt 以及我的内容假设是算法的结果,因此取决于使用的密码。
<强>算法:强>
对于bcrypt哈希,这应该是'$ 2y $',尽管'$ 2x $'和'$ 2a $'也是可能的。见PHP's manual entry on crypt()。 (如果可以的话,PHPASS使用crypt())
<强>费用:强>
04-31范围内的2个字符宽的零填充值。 1&lt;&lt; {{}}将在内部使用,这就是为什么31是上限(32位可用)。
<强>盐强>
字母表中的22个字符“./0-9A-Za-z”。
将哈希用作salt时,不会使用其余字符。
Here is some code and its output that might clear up how it works when used correctly:
<cost>
答案 2 :(得分:0)
感谢您的帮助窥视我似乎现在正在工作,但如果您愿意为我检查它,如果没关系,其他人可能会发现它有用,请记住它只是测试文件所以更多将是如果核心没问题,则添加
这是用于散列密码并存储密码的REG代码。
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_BCRYPT);
if (empty($_POST) === false){
mysql_query("INSERT INTO `accounts` VALUES ('', '$username', '$hash') ");
echo 'Done';
}else{
echo 'Not Done';
}
} ?>
这是登录
<?php
require('../password/lib/password.php');
require_once("connect.php");
if(isset($_POST['submit'])) {
$username = $_POST['username'];
$safe_username = mysql_real_escape_string($username);
$password = $_POST['password'];
$query = "SELECT * FROM accounts WHERE username = '$safe_username'";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$hash = $row['password'];
if (password_verify($password, $hash)) {
echo 'Logged in';
} else {
echo 'Not logged in';
}
} else {
echo " Not submitted";
}
您怎么看?