53

我正在使用 sha256 来加密密码。我可以将sha256加密密码保存在mysql中。但我无法使用相同的子句登录。

插入代码:

<?php
error_reporting(E_ALL ^ E_NOTICE);
$username = $_POST['uusername'];
$passcode = $_POST['ppasscode'];
$userflag = $_POST['uuserflag'];
//$passcodeen = hash('sha256',$passcode);
$passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
$conn = mysql_connect("localhost","charles","charles") or die("connection failed with DB:".mysql_error());
mysql_select_db("sessiondb");
$query = "INSERT INTO users(username,passcode,userflag) values('$username','$passcodeen','$userflag')";

选择代码:

<?php 
error_reporting(E_ALL ^ E_NOTICE);

    @mysql_connect("localhost","charles","charles") or die("Connection failed".mysql_error());
    @mysql_select_db("sessiondb") or die("Database doesn't exist".mysql_error());
    //get user input
    $username = $_POST['username'];
    $ppasscode = $_POST['ppasscode'];
    //$passcodeen = hash('sha256', $ppasscode);
    $passcodeen = hash('sha256', (get_magic_quotes_gpc() ? stripslashes($ppasscode) : $ppasscode));
    //get session value from mysql
    $query = @mysql_query("select username, userflag from users where username ='$username' and passcode = '$passcodeen'") or die("Query execution failed".mysql_error());

有什么不对?我很困惑。谢谢。

4

5 回答 5

80

这可能是一个错字吗?(ppasscode 中有两个 P,是有意的吗?)

$_POST['ppasscode'];

我会确保并做到:

print_r($_POST);

并确保那里的数据是准确的,然后回显它应该是什么样子:

echo hash('sha256', $_POST['ppasscode']);

将此输出与您在数据库中的输出进行比较(手动)。通过这样做,您正在探索可能的故障点:

  1. 从表单获取密码
  2. 散列密码
  3. 存储密码
  4. 两者的比较。
于 2009-11-17T23:23:57.740 回答
12

首先,sha256 是一种散列算法,而不是一种加密。加密需要有一种方法将信息解密回其原始值(除了冲突)。

查看您的代码,如果您提供正确的参数,它似乎应该可以工作。

  • 首先尝试在代码中使用文字字符串,并验证其有效性而不是使用$_POST[]变量

  • 尝试将比较从数据库查询移动到代码(获取给定用户的哈希并与您刚刚计算的哈希进行比较)

但最重要的是,在以任何公共方式部署它之前,请记住清理您的输入。不允许将任意 SQL 插入到查询中。这里最好的想法是使用参数化查询。

于 2009-11-17T23:30:56.410 回答
2

您应该使用像http://en.wikipedia.org/wiki/Bcrypt这样的自适应哈希来保护密码

于 2014-02-07T12:33:48.157 回答
2

首先是对SHA的功能进行比较,并选择支持您的编程语言(PHP)的最安全的算法。

然后,您可以阅读官方文档来实现hash()接收您选择的散列算法和原始密码作为参数的函数。

sha256 => 64 bits sha384 => 96 bits sha512 => 128 bits

哈希算法越安全,在哈希和从服务器端恢复原始值的时间方面的成本就越高。

$hashedPassword = hash('sha256', $password);
于 2018-09-28T17:00:56.337 回答
1

更好的解决方案是仅使用 Anthony Ferrara 提供的出色兼容性脚本:

https://github.com/ircmaxell/password_compat

请,并且,在检查密码时,如果需要,请始终添加一种方式(最好是异步的,因此它不会影响定时攻击的检查过程)来更新哈希。

于 2017-07-04T12:16:46.013 回答