0

我一直在搞乱 PHP 中的密码加密,起初我使用 MD5 函数将密码保存在数据库中,但我在登录时遇到了麻烦。然后我尝试了哈希函数,但我再次无法登录。

我尝试这样做的方法是在创建帐户时对密码进行加密,然后每次有人登录时,密码都会使用相同的方法再次加密,然后检查数据库以查看加密的密码是否匹配. 我可以很好地创建一个帐户,似乎每当我使用相同的密码创建一个帐户时,哈希值都是相同的,所以我假设它们每次都不会改变(我对加密和哈希值知之甚少)。

这是我当前的新用户创建片段:

<?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")

谁能帮我理解为什么实际登录失败。我使用完全相同的密码进行创建和登录(显然)并使用相同的加密方法。这真的让我很困惑。

4

3 回答 3

2

“我可以很好地创建一个帐户,而且似乎每当我使用相同的密码创建一个帐户时,哈希值都是相同的,所以我假设它们每次都不会改变”

当然,它必须是这样的。如果同一字符串的加密哈希每次都会更改,那将是一件坏事,不是吗?:)

届时,用户将无法多次使用他们的密码。完全没问题。

还可以考虑加盐密码。这意味着:生成一个随机哈希并将其与用户一起存储在您的数据库中。

登录时,您不仅要检查密码哈希,还要检查盐。

这将大大提高安全性。

于 2013-08-01T07:01:00.520 回答
2

首先,正如我对您的问题的评论,PHP 密码的安全哈希和盐有很多相关信息。

要提取某种“从这里开始并执行此操作”:

PHPass的使用非常简单,这里有一个简单易学的教程

于 2013-08-01T07:08:09.313 回答
0

你可能想看看这个。而不是使用sprintf();尝试使用:

$insertSQL = "INSERT INTO users (username, password, name) 
VALUES ('".GetSQLValueString($_POST['username'], "text")."',
'".GetSQLValueString(hash("sha512",$_POST['password']),"text")."',
'".GetSQLValueString($_POST['name'], "text")."')";

现在检查您是否已成功插入这些值。

我强烈建议您使用mysqli_*or PDO

于 2013-08-01T10:05:03.620 回答