[英]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.