【问题标题】:encrypt_decrypt() function is returning nothing only when I try to decryptencrypt_decrypt() 函数仅在我尝试解密时不返回任何内容
【发布时间】:2016-05-08 10:45:55
【问题描述】:

我一直在为学校做一个附带项目,用户可以登录并记录他们拥有的志愿者小时数。我已经完成了连接到数据库并存储用户信息(包括加密密码)的注册页面。 我遇到的问题是用户尝试登录时。输入密码后,程序进入数据库并检索散列函数,但是当我尝试解密时,解密的行是空白的。我不确定为什么会这样,但想一些帮助解决这个问题。谢谢。

这是我的登录页面和 encrypt_decrypt() 函数的代码:

login.php 页面:

<?php

include("encrypt_decrypt.php");

$username="root";
$password="";
$server="localhost";
$db_name="userauthentication";

$uname="";
$pword="";
$error_msg = "";

if(isset($_POST["submit"])){

    $db_handle = mysqli_connect($server, $username, $password);
    $db_found = mysqli_select_db($db_handle, $db_name);

    $uname = $_POST["uname"];
    $uname = htmlspecialchars($uname);
    $uname = mysqli_real_escape_string($db_handle, $uname);

    $pword = $_POST["pword"];
    $pword = htmlspecialchars($pword);
    $pword = mysqli_real_escape_string($db_handle, $pword);

        if($db_found){
            if($uname == "admin"){
                $SQL = "SELECT * FROM  WHERE username = '$uname' AND pword = '$pword'";
                $result = mysqli_query($db_handle, $SQL);

                $num_rows = mysqli_num_rows($result);

                    if(isset($num_rows) && $num_rows > 0){
                        session_start();
                        $_SESSION['login'] = "2";
                        header("Location: adminpage.html");
                    }else{
                        print("error");
                    }
            }else{
                $SQL = "SELECT * FROM login WHERE username = '$uname'";
                $result = mysqli_query($db_handle, $SQL);

                $num_rows = mysqli_num_rows($result);

                if($num_rows > 0){

                    $db_field = mysqli_fetch_assoc($result);

                    $pword_match = $db_field['password'];
                    $pword_match = encrypt_decrypt('decrypt', $pword_match);

                    print ($pword . "<br>");
                    print $pword_match;

                    if($pword == $pword_match){
                        session_start();
                        $_SESSION['login'] = "1";
                        header("Location: mainpage.html");
                    }else{
                        $error_msg = "<span class='error_msg'>Wrong password!</span>";
                        print $error_msg;
                    }
                }else if($num_rows == 0){
                    $error_msg = "<span class='error_msg'>Wrong username!</span>";
                    print $error_msg;
                }
            }
        }else{
            $error_msg = "<span class='register'>Could not connect to database!</span>";
            print $error_msg;
        }
    }
?>

这些是在 login.php 文件中给我带来麻烦的行:

$db_field = mysqli_fetch_assoc($result);

$pword_match = $db_field['password'];
$pword_match = encrypt_decrypt('decrypt', $pword_match);

print ($pword . "<br>");
print $pword_match;

我刚刚打印出这两行,这样我就可以看到发生了什么。 print $pword 行很好,但是 print $pword_match 给了我一个空白。

encrypt_decrypt() 函数:

<?php       
    function encrypt_decrypt($action, $string) {
    $output = false;

    $encrypt_method = "AES-256-CBC";
    $secret_key = $string;
    $secret_iv = "password";
    // hash
    $key = hash('sha256', $secret_key);

    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

    if( $action == 'encrypt' ) {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    }
    else if( $action == 'decrypt' ){
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }

    return $output;
}
?>

【问题讨论】:

  • 制作两个函数。
  • 密码应该永远被解密。使用单向哈希对密码进行哈希处理,使用 PHP 的密码哈希 API。
  • 您永远不应该加密您的用户密码。您需要使用散列代替一些强大的散列,例如 PBKDF2、bcrypt、scrypt 和 Argon2。由于散列函数是单向函数,因此您将无法“解密”散列。为了验证您的用户,您可以再次通过哈希函数运行密码,以便与存储在数据库中的哈希值进行比较。查看更多:How to securely hash passwords?

标签: php mysql encryption login


【解决方案1】:

关于如何在服务器上处理密码有数百个答案,搜索示例代码。

基本上在第一次收到密码时对其进行哈希处理并将哈希存储在服务器上。当用户想要登录时,密码哈希被检索,密码被哈希,然后比较哈希。

请参阅:Safe Password Hashing

注意:加密密码意味着密钥在服务器上,如果攻击者获得了所有密码,攻击者将可以使用。如果您认为服务器是安全的,您就不会费心加密密码。不能依赖服务器的安全性,但您至少应该对服务器使用 2 因素身份验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2017-11-21
    • 2021-03-05
    • 1970-01-01
    • 2023-02-04
    • 2018-08-27
    相关资源
    最近更新 更多