我一直在使用PHP中的密码加密,起初我使用MD5函数将密码保存在数据库中,但是我在登录时遇到了麻烦。然后我尝试了哈希函数并再次遇到记录问题in。
我尝试这样做的方法是在创建帐户时加密密码,然后每次有人登录时,使用相同的方法再次加密密码,然后检查数据库以查看是否加密密码匹配。我可以创建一个帐户很好,似乎每当我创建一个具有相同密码的帐户时,哈希是相同的,所以我假设他们不会每次都改变(我对加密和哈希知之甚少)。
这是我目前的新用户创建代码段:
<?php
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "NewUser")) {
$insertSQL = sprintf("INSERT INTO users (username, password, name) VALUES (%s, %s, %s)",
GetSQLValueString($_POST['username'], "text"),
GetSQLValueString(hash("sha512",$_POST['password']), "text"),
GetSQLValueString($_POST['name'], "text"));
mysql_select_db($database_ReallyGoodPieConnection, $ReallyGoodPieConnection);
$Result1 = mysql_query($insertSQL, $ReallyGoodPieConnection) or die(mysql_error());
?>
这是我的登录片段:
if (isset($_POST['username'])) {
$loginUsername=$_POST['username'];
$password=$_POST['password'];
$password = hash("sha512", $password);
print $password;
$MM_fldUserAuthorization = "permissions";
$MM_redirectLoginSuccess = "index.php";
$MM_redirectLoginFailed = "login.php";
$MM_redirecttoReferrer = true;
mysql_select_db($database_ReallyGoodPieConnection, $ReallyGoodPieConnection);
$LoginRS__query=sprintf("SELECT username, password FROM users WHERE username=%s AND password=%s",
GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")
任何人都可以帮助我理解实际登录失败的原因。我使用完全相同的密码进行创建和登录(显然)并使用相同的加密方法。这真让我感到困惑。
答案 0 :(得分:2)
“我可以创建一个帐户,看起来每当我使用相同的密码创建一个帐户时,哈希都是相同的,所以我假设他们每次都不会改变”
当然必须是这样的。如果同一个字符串的加密哈希值每次都会改变,那将是一件坏事,不是吗? :)
用户将无法使用多次密码。这完全可以。
还要考虑保存密码。这意味着:生成随机哈希并将其与用户一起存储在您的数据库中。
登录时,您不仅要检查密码哈希,还要检查盐。
这将进一步提高安全性。
答案 1 :(得分:2)
首先,正如我对您的问题发表评论,Secure hash and salt for PHP passwords有很多相关信息。
提取某种“从这里开始并做到这一点”:
答案 2 :(得分:0)
您可能需要查看this。而不是使用sprintf();
尝试使用:
$insertSQL = "INSERT INTO users (username, password, name)
VALUES ('".GetSQLValueString($_POST['username'], "text")."',
'".GetSQLValueString(hash("sha512",$_POST['password']),"text")."',
'".GetSQLValueString($_POST['name'], "text")."')";
现在检查您是否已成功插入值。
我强烈建议您使用mysqli_*
或PDO
。