将纯文本密码登录转换为哈希


convert plain text password login to hash

可能的重复项:
PHP 密码的安全哈希和盐

我正在为我的网站开发一个PHP脚本,它自己的网站已经启动并运行。我遇到的问题是网站上的注册是纯文本密码。显然,这是非常弱的安全性。我希望有人可以帮助我转换它,以便我可以使用哈希密码。我已经包含了我认为重要的部分注册码。我没有在页面上包含所有代码,因为我认为它不相关,但如果有人认为它会有所帮助,我会提供。

require 'include.inc';
if ($signup) {
if ($signup[repassword] != $signup[password]) {
    $err_msg = "Your passwords do not match.";
error($err_msg);
}
if(!preg_match("^[_'.0-9a-z-]+$/i^", $str)) {
$msg = 'Invalid Username! Usernames can consist of letters and numbers only';
}
if(!preg_match("^[_'.0-9a-z-]+$^",$signup[password])) {
   $err_msg = "Invalid Password!  Passwords can consist of letters and numbers   only.";
}
  if(!$signup[password] || !$signup[username] || !$signup[email] || !$signup[username])
        $err_msg = "Oops! You forgot some important fields!";

  if (!$err_msg) {
$usercheck = @mysql_query("INSERT INTO user values(
    'NULL','$signup[fname]','$signup[lname]',
    '$signup[username]','$signup[password]','$signup[email]', 1, ".$pointInc.",     '$signup[referral]', NOW(), 'n', 'y')");
      // done, you are entered correctly, Now Enter the points and URL info

        $sql = "Select id from user where username='$signup[username]'";
    $result = mysql_query( $sql );
        if ( $result != false )
            {
        while ( $data = mysql_fetch_assoc( $result ) )
        {
            $point_set = $data['id'];
            }
        } else {
            echo mysql_error();
        }   
    // add rerral points
if ($signup[referral])  {
  $referralSql="UPDATE points SET points=points+ ".$refPoints . " WHERE     userid=".$signup[referral];
  $result = mysql_query( $referralSql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                    }
    }                           

// add URL  
$sql="INSERT INTO url_table ( userid, website, active, datechanged) VALUES ($point_set,'".$signup[site_url]."','n', '".date("Ymd")."')";
  $result = mysql_query( $sql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                }
// add points
    $sql="INSERT INTO points (userid, username, points) VALUES ($point_set,'     ',$signPoints)";
  $result = mysql_query( $sql );
                if ( $result != false )
                    {
                } else {
                    echo mysql_error();
                    }
    }
     echo mysql_errno().": ".mysql_error()."<br>";


            if (!$usercheck) {
       $err_msg = "Database error:<br>There was an error entering your account.<br>It is possible that username or Email already exists, please try another one.<br>";
         }   else {
            include ("reg.php"); 
            exit;
            }
     }
     if (!$err_msg) {
        // done, you are entered correctly

     }
   pageHeader($title, $bgColor, $styleSheet);
?>

基本原理很简单:

1 .当用户注册时,不要存储明文密码,而是hash(password)

$query = $pdoObject->prepare('INSERT INTO users (UserName, Password) VALUES (:u, :p)');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// Note that we don't store the password, we store the hash of the password. Once this script is done executing, no one involved in the website (except for the original user) will know that the password is
$query->execute();

阿拉伯数字。当用户尝试登录时,使用存储在用户数据库中的哈希计算输入密码的哈希。如果两个哈希匹配,则密码正确。

$query = $pdoObject->prepare('SELECT * FROM users WHERE UserName = :u AND Password = :p');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// We locate the original user by searching for the hash of the password that they typed in

理论就这么多。您应该考虑的一些实际问题:

  1. 许多教程建议使用 SHA1 的 MD5 作为哈希函数。但是,这些并不安全。检查 PHP 哈希库(尤其是 hash() 函数)以获取可用的哈希算法。
  2. 您还应该考虑使用加盐密码。对于每个注册用户,创建一个随机字符串(salt),将此字符串与用户的密码连接起来,然后对密码和salt进行哈希处理(盐也需要保存,因为在对用户进行身份验证时再次需要它)。
  3. 您可以使用 PDO 使您的 SQL 更安全。这将保护您免受称为 SQL Injection .如果您不这样做,那么用户将能够通过输入撇号 (') 等字符来搞砸您的网站。

您可以使用 md5 函数为密码创建哈希,例如:

$password = '12345';
$password = md5($password);

您将此哈希保存在数据库中,当您检查登录的用户和密码时,您会这样做

$post['password'] = md5($post['password']);

并检查是否等于数据库中保存的哈希值。我知道 md5 不是最好的哈希,但很简单并且具有良好的安全性

使用 crypt 对密码进行哈希处理。

将 md5 用于该 http://php.net/manual/en/function.md5.php

另查找 uniqid http://php.net/manual/en/function.uniqid.php

密码以纯文本形式存储在数据库中始终是一种不好的做法。检查另一个问题:使用 PhP 加密存储在 MySql 中的密码的最佳实践是什么?

有些意见认为md5或SHA-1不可破解,请尝试对其进行盐渍..搜索。