无法获得密码加密来使用PHP

时间:2013-08-01 06:54:16

标签: php mysql encryption

我一直在使用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")

任何人都可以帮助我理解实际登录失败的原因。我使用完全相同的密码进行创建和登录(显然)并使用相同的加密方法。这真让我感到困惑。

3 个答案:

答案 0 :(得分:2)

“我可以创建一个帐户,看起来每当我使用相同的密码创建一个帐户时,哈希都是相同的,所以我假设他们每次都不会改变”

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

用户将无法使用多次密码。这完全可以。

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

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

这将进一步提高安全性。

答案 1 :(得分:2)

首先,正如我对您的问题发表评论,Secure hash and salt for PHP passwords有很多相关信息。

提取某种“从这里开始并做到这一点”:

使用PHPass非常简单,有一个简单易懂的教程Here

答案 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