2012-07-10 169 views
1

嘗試爲使用PHP/MySQL的客戶端開發AES加密數據庫。插入加密值正在工作,但無法返回可用的解密值。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] => [email protected] 
     [AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => [email protected] 
    ) 

這是一個次級溶液。理想情況下,查詢將是面向對象的,但是這種方法是返回一個帶有字段但沒有值的數組。

顯然,在結果中傳遞完整的授權密鑰完全違反了加密的目的。混淆爲什麼它返回一個組合的關聯/索引數組,而不僅僅是一個索引數組,或者只是一個關聯數組。 SQL語法是否有變化,將返回[user_email] => [email protected] 而不是 [AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => [email protected]

+0

像這樣的加密通常在應用程序中完成,而不是在MySQL中完成。當在MySQL中完成時,祕密密鑰在MySQL日誌中結束。 – 2012-07-10 18:35:36

+0

這個特定的項目需要數據在休息,傳輸和驅動器級別進行加密。另外,我不熟悉PHP中的任何加密方法。 – dyelawn 2012-07-10 20:07:47

+0

爲避免記錄密鑰,您應該在PHP中執行加密/解密操作,並僅將加密值存儲在MySQL中。看看[mcrypt](http://php.net/manual/en/book.mcrypt.php),特別是[代碼示例](http://www.chilkatsoft.com/p/php_aes。 ASP)。 – 2012-07-10 21:26:13

回答

1

您需要使用一個別名,其中包括功能欄:

$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"; 

從MySQL文檔SELECT

一個select_expr可以給使用AS alias_name起一個別名。別名是 ,用作表達式的列名稱,可用於GROUP BY, ORDER BY或HAVING子句。例如:

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

像這樣的加密通常是在應用程序中而不是在MySQL中完成的。當在MySQL中完成時,祕密密鑰在MySQL日誌中結束。