如何在$ _POST上散列SHA2?

时间:2014-04-24 09:00:21

标签: php mysql sql sha2

我正在尝试使用SHA2加密我的'密码'列。问题是MYSQL的注入是通过一个$ _POST变量,所以我不明白我应该把SHA2()放在哪里。

这是我的'插入'页面(inscreate.php):

  <?php
    include 'header.php';
    $ins="INSERT INTO users (uname, pwrd, bdate, mail)
        VALUES ('$_POST[uname]','$_POST[pwrd]','$_POST[bdate]','$_POST[mail]')";
if (!mysqli_query($con,$ins))
      {
      die('Error: ' . mysqli_error($con));
      }
    echo "User added! You will be returned to the index page!";

    mysqli_close($con);
    ?>  

根据我的阅读,我必须将其放在我的插入查询的'value'部分:http://coderlearner.com/MySQL_Encryption-Decryption_Example_SHA2

所以我尝试了这些组合:

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
            VALUES ('$_POST[uname]','SHA2($_POST[pwrd])','$_POST[bdate]','$_POST[mail]')";

但是如果密码是例如:mypass,我的数据库中的输出是:SHA2(mypass)

我试过了:

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
    VALUES ('$_POST[uname]',$_POST[SHA2(pwrd)]','$_POST[bdate]','$_POST[mail]')";

但后来我得到了一个Parse错误(我理解为什么,但我只是在尝试) 所以我的问题是:有谁知道我如何加密$ _POST ??

3 个答案:

答案 0 :(得分:2)

再看一下这些例子。

mysql> INSERT INTO userpassword(id, username,password)
    -> VALUES(null,'Lili',SHA2('mypassword1',256));

引号绕着字符串。 SHA2()函数调用绕过引号。

同样SHA2()需要两个参数。

'SHA2($_POST[pwrd])'

应该是:

SHA2('$_POST[pwrd]', 256)

...但不要将POST数据直接粘贴到SQL中。它会让您易受SQL injection attacks 攻击,而您需要自己defend

答案 1 :(得分:1)

SHA *哈希函数不适合密码,因为它们的速度太快了。您的示例中的另一个问题是,您正在生成未加盐的哈希值。看看PHP函数password_hash(),它将生成一个BCrypt哈希并负责生成安全盐。对于较旧的PHP版本,还存在compatibility pack

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

这也意味着您无法直接在SQL语句中验证密码,而是从数据库中读取哈希值(通过用户名),然后使用此哈希值调用password_verify()。

答案 2 :(得分:0)

使用SHA2('$_POST[pwrd]',256)代替'SHA2($_POST[pwrd])'

$ins="INSERT INTO users (uname, pwrd, bdate, mail)
       VALUES 
('$_POST[uname]',SHA2('$_POST[pwrd]',256),'$_POST[bdate]','$_POST[mail]')";