【问题标题】:Password encrypts correctly but decrypts incorrectly from database密码正确加密但从数据库中错误解密
【发布时间】:2015-11-12 06:15:18
【问题描述】:

密码加密得很好。但是解密很奇怪。它没有给我破译的密码。

这是解密结果/输出:http://prntscr.com/91q0rv

表结构:http://prntscr.com/91qgcs

现在,我将发布所有相关代码。但是为了节省一些时间,请密切关注 login_db.php,它就是问题所在。

db.php

$mysql_hostname = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "db_bank";

$db = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or die ("couldn't select any database");
mysql_select_db($mysql_database, $db) or die ("couldn't select any database");

mysql_query("set character_set_server='utf8'");
mysql_query("set names 'utf8'");


$key = 'Dr. Imran';
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);



register_db.php

include('db.php');

$fname=$_POST['fname'];
$username=$_POST['username'];
$password = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $_POST['password'], MCRYPT_MODE_CBC, $iv);
$password = base64_encode($password);
echo $password.'<br>';
$email=$_POST['email'];
$phone=$_POST['phone'];
$country=$_POST['country'];
$age=$_POST['age'];
$gender=$_POST['gender'];

$check="SELECT * FROM customers WHERE Username='$username'";
$results=mysql_query($check);

$check2="SELECT * FROM customers WHERE Email='$email'";
$results2=mysql_query($check2);

if(mysql_num_rows($results) == 0)
{ $check='true'; }

else
{ header("location: register.php?username=false"); }


if(mysql_num_rows($results2) == 0)
{ $check2='true'; }

else
{
    if($check!='true')
    { header("location: register.php?username=false&email=false"); }

    else
    { header("location: register.php?email=false"); }
}


if($check=='true' && $check2='true')
{
    for($i=0; $i<1; $i++)
    {
        $id=rand(2000,3000);

        $check3="SELECT * FROM customers WHERE ID='$id'";
        $results3=mysql_query($check3);


        if(mysql_num_rows($results3) > 0)
        { $i=-1;  }

        else
        {
            mysql_query("INSERT INTO customers (Fname, Username, Password, Email, Phone, Country, Age, Gender, ID) VALUES ('$fname', '$username', '$password','$email', '$phone', '$country', '$age', '$gender', '$id')");
            header("location: login.php?register=success");
        }
    }
}


mysql_close($db);



login_db.php

session_start();
include('db.php');


    $username = $_POST['UserOrEmail'];
    $email = $_POST['UserOrEmail'];
    $password = $_POST['password'];

    $qry="SELECT * FROM customers WHERE (username='$username' OR email='$email')";

    $results=mysql_query($qry);


    if(mysql_num_rows($results) > 0)
    {
        $rows = mysql_fetch_assoc($results);

        //Here is where the problem coming from
        $check = base64_decode($rows['Password']);
        $check = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $check, MCRYPT_MODE_CBC, $iv);

        if($password == $check)
        {
        $_SESSION['username'] = $rows['Username'];
        header("location: index.php");
        }
    }


    else { die("Login failed"); }



我希望这可以帮助您找出问题

【问题讨论】:

标签: php encryption


【解决方案1】:

每次 db.php 加载时,您都会生成一个新的$iv。您也应该存储它,以便使用相同的一个进行加密和解密。

【讨论】:

  • 是的。那可能是真的。因为每次刷新页面时解密的密码都会更改。解决方案?
  • 您必须将用于加密密码的$iv 值存储在数据库的单独列中。然后,您必须在解密时检索此值。
  • 你是对的。 (如果我听起来很愚蠢,我很抱歉),但我不能使用用户名作为$iv吗?
  • 我的意思是,对于每个密码,它的用户名都是$iv,但是在数据库中存储$iv 就像要求被黑客入侵一样。 (感谢上帝,这不是一个真正的项目)
  • $iv 甚至可以公开使用,但建议将其保密。因此,将它与加密字符串一起放在数据库中就可以了。参考:mcrypt_create_iv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2017-06-12
相关资源
最近更新 更多