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

Php 将纯文本密码登录转换为哈希,php,hash,login,passwords,Php,Hash,Login,Passwords,可能重复: 我正在为我的网站编写一个PHP脚本,该网站已经启动并运行。我的问题是,在网站上注册的是纯文本密码。显然,这是非常脆弱的安全。我希望有人能帮我转换它,这样我就可以使用哈希密码。 我已经包括了我认为重要的部分注册码。我没有在页面上包括所有代码,因为我认为它不相关,但如果有人认为它会有帮助,我会提供 require 'include.inc'; if ($signup) { if ($signup[repassword] != $signup[password]) { $err

可能重复:

我正在为我的网站编写一个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);
?>
要求“include.inc”;
如果($注册){
如果($signup[repassword]!=$signup[password]){
$err\u msg=“您的密码不匹配。”;
错误($err_msg);
}
如果(!preg_match(“^0-9a-z-]+$/i^,$str)){
$msg='用户名无效!用户名只能由字母和数字组成';
}
如果(!preg_match(“^[\u\.0-9a-z-]+$^,$signup[password])){
$err_msg=“密码无效!密码只能由字母和数字组成。”;
}
如果(!$signup[密码]| |!$signup[用户名]| |!$signup[电子邮件]| |!$signup[用户名])
$err_msg=“哎呀!你忘了一些重要字段!”;
如果(!$err\u msg){
$usercheck=@mysql\u query(“插入到用户值中(
'NULL'、'$signup[fname]、'$signup[lname],
“$signup[username]”、“$signup[password]”、“$signup[email]”、1、“$pointInc.”、“$signup[reference]”、NOW()、“n”、“y”);
//完成后,输入正确,现在输入点和URL信息
$sql=“从用户名为“$signup[username]”的用户中选择id”;
$result=mysql\u查询($sql);
如果($result!=false)
{
而($data=mysql\u fetch\u assoc($result))
{
$point_set=$data['id'];
}
}否则{
echo mysql_error();
}   
//加分
如果($注册[转介]){
$referralSql=“更新点设置点=点+”$refPoints。“其中userid=”.$signup[reference];
$result=mysql\u查询($referralSql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
}                           
//添加URL
$sql=“插入url_表(用户ID、网站、活动、日期更改)值($point_set,“$signup[site_url]”、'n'、'”。日期(“Ymd”)。“)”;
$result=mysql\u查询($sql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
//加分
$sql=“插入点(用户ID、用户名、点)值($point_set,,$signPoints)”;
$result=mysql\u查询($sql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
}
echo mysql_errno().“:”.mysql_error().“
”; 如果(!$usercheck){ $err_msg=“数据库错误:
输入您的帐户时出错。
可能用户名或电子邮件已经存在,请尝试另一个。
”; }否则{ 包括(“reg.php”); 出口 } } 如果(!$err\u msg){ //完成后,您的输入正确 } 页眉($title,$bgColor,$styleSheet); ?>
您可以使用md5函数为密码创建哈希,例如:

$password = '12345';
$password = md5($password);
您将此散列保存在数据库中,并在检查登录的用户和密码时执行此操作

$post['password'] = md5($post['password']);
并检查是否等于数据库中保存的哈希值。
我知道md5不是最好的散列,但它很简单,安全性也很好

基本原理很简单:

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

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

$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
理论到此为止。您应该考虑的一些实际问题:

  • 许多教程建议使用SHA1的MD5作为散列函数。但是,。检查(尤其是
    hash()
    函数)以了解可用的哈希算法
  • 你也应该考虑使用。对于每个注册用户,创建一个随机字符串(salt),将该字符串与用户的密码连接起来,然后对密码和salt进行散列(salt也需要保存,因为在验证用户时需要再次使用它)
  • 您可以使用使SQL更安全。这将保护您免受名为
    SQL注入的攻击。如果您不这样做,那么用户将能够通过输入撇号(
    )等字符来搞乱您的网站
  • 使用md5实现这一点

    还可以查看uniqid

    在数据库中以纯文本形式存储密码总是一种不好的做法。请勾选其他问题:

    用于对密码进行哈希运算。

    有些观点认为md5或SHA-1不易破解,尝试对它们进行加密。。搜索该漏洞。

    您有SQL注入漏洞。
    密码只能由字母和数字组成。
    。。这是非常错误的。不要限制我的密码中可以包含的字符。。。。它限制了我,增加了代码的复杂性,降低了安全性,而且完全没有必要为字符串创建哈希很容易,而且需要多次,只是!尝试此链接或使用普通MD5作为哈希算法是非常不安全的。MD5散列的计算速度非常快(使暴力变得简单),而且算法容易发生冲突。使用uniqid进行散列有什么意义?无论如何,+1表示指向更好的资源。md5实际上不是哈希密码的好选择。@Giuliomusarello这是为了让询问者对安全性有更多的了解。谢谢:)@troelskn是的,但这是开始阅读、学习的好方法,而且只要你不保护你的登录表单不受外部请求的影响,没有人会尝试破解这样的代码
    $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