【问题标题】:Can't get password encryption to work PHP无法获得密码加密以工作 PHP
【发布时间】:2013-08-01 06:54:16
【问题描述】:

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

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

这是我当前的新用户创建sn-p:

<?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());

?>

这是我的登录 sn-p:

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

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

【问题讨论】:

  • 不要混淆哈希和加密,they are different things。
  • 堆栈溢出问题stackoverflow.com/questions/401656/…对PHP中的密码有很多很好的阅读
  • @FDL 好的,谢谢。就像我说的那样,我对这些东西的了解并不是那么好
  • 您的登录 sn-p 似乎不完整。提交的密码和存储的哈希之间没有实际的比较。
  • 对不起,我会添加其余的。我只是在演示散列方法。

标签: php mysql encryption


【解决方案1】:

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

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

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

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

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

这将大大提高安全性。

【讨论】:

  • 您知道实际登录失败的原因吗?这是在登录过程和创建帐户过程中输入的完全相同的密码,我使用的是相同的加密方法:S.
  • 您能否提供存储在数据库中的示例密码的哈希值以及输入字段中输入的哈希值?确保密码输入字段的值没有被任何方式操纵。
【解决方案2】:

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

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

很容易使用PHPass 并且有一个简单易学的教程Here

【讨论】:

    【解决方案3】:

    您可能想看看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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多