簡體   English   中英

MySQL AES解密返回值

[英]MySQL AES Decrypt Return Values

嘗試使用PHP / MySQL為客戶端開發AES加密的數據庫。 插入加密的值是可行的,但是在返回可用的解密值時遇到麻煩。

public static function auth($username="", $password="") {
    global $database;
    $fields = self::$db_fields;
    array_shift($fields);
    $username = $database->escape_value($username);
    $password = $database->escape_value($password);
    $hashed_pwd = sha1($password);
    $join_str = ", '" . AUTH_KEY . "'), AES_DECRYPT(";

    $sql  = "SELECT id, AES_DECRYPT(";
    $sql .=  join($join_str, $fields) . ", '" . AUTH_KEY . "') FROM " . self::$table_name. " ";
    $sql .= "WHERE u_name = AES_ENCRYPT('{$username}', '" . AUTH_KEY . "') ";
    $sql .= "AND u_pwd = AES_ENCRYPT('{$hashed_pwd}', '" . AUTH_KEY . "') ";
    $sql .= "LIMIT 1";

用以下查詢:

    $query_result = $database->query($sql);
    $result_array = $database->fetch_array($query_result);

}

返回值:

    Array ( 
        [0] => 5 
        [id] => 5 
        [1] => a_user_name 
        [AES_DECRYPT(user_name, '[PRINTS FULL AUTH KEY]')] => a_user_name 
        [2] => 0000hashedpasswordstring00000 
        [AES_DECRYPT(user_pwd, '[PRINTS FULL AUTH KEY]')] => 0000hashedpasswordstring00000  
        [3] => sample@email.com 
        [AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => sample@email.com 
    )

這是次要解決方案。 理想情況下,查詢將是面向對象的,但是這種方法是返回一個包含字段但沒有值的數組。

顯然,在結果中傳輸完整的身份驗證密鑰會完全破壞加密的目的。 對於為什么返回組合的關聯/索引數組而不是僅返回索引數組或關聯數組感到困惑。 SQL語法是否有變化,將返回[user_email] => sample@email.com而不是[AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => sample@email.com嗎?

您需要為包含函數的列使用別名:

$sql  = "SELECT id, AES_DECRYPT(";
$sql .=  join($join_str, $fields) . ", '" . AUTH_KEY . "') AS user_email FROM " . self::$table_name. " ";
$sql .= "WHERE u_name = AES_ENCRYPT('{$username}', '" . AUTH_KEY . "') ";
$sql .= "AND u_pwd = AES_ENCRYPT('{$hashed_pwd}', '" . AUTH_KEY . "') ";
$sql .= "LIMIT 1";

從有關SELECT的 MySQL文檔中:

可以使用AS alias_name為select_expr賦予別名。 別名用作表達式的列名,並且可以在GROUP BY,ORDER BY或HAVING子句中使用。 例如:

SELECT CONCAT(last_name,',',first_name)AS full_name FROM mytable ORDER BY full_name;

這樣的加密通常在應用程序中完成,而不是在MySQL中完成。 在MySQL中完成后,密鑰最終會出現在MySQL日志中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM