2014-01-22 28 views
0

我的代碼工作得很好。但之後我決定在將數據存儲在數據庫之前加密值。我將aes_encrypt存儲在數據庫中時使用它來加密值。我正在使用aes_decrypt解密從數據庫中檢索/選擇的值。這使我可以使用列名作爲關聯數組的元素,但現在元素名稱全部搞亂了。這裏是我的代碼:使用aes_decrypt和fetch_assoc

$databaseObject = connectToDB(); 
$result = $databaseObject->query("SELECT AES_DECRYPT(column_name, '".ENCRYPT_KEY."') FROM tempTable WHERE `id` = 3"); 
$assoc_array = $result->fetch_assoc(); 
var_dump($assoc_array); 
echo $assoc_array['column_name']; 

該代碼輸出如下:

array(1) { ["AES_DECRYPT(column_name, '6da6365bd886f275731d4662c0c29992fdd59a5d')"]=> string(7) "siracha" } siracha 

在列中的值是siracha和列名是column_name

我想繼續使用關聯數組,但我不想使用$assoc_array["AES_DECRYPT(column_name, '6da6365bd886f275731d4662c0c29992fdd59a5d')"]來獲取值。 6da6365bd886f275731d4662c0c29992fdd59a5d部分是我在將值存儲到數據庫之前用於加密數據的關鍵。

非常感謝您始終有幫助的建議。

回答

0

第一:不要在MySQL中進行加密。將加密密鑰傳遞給數據庫引擎是不安全的,因爲它很容易導致您的加密密鑰出現在輸出網頁中(例如,如果您的PHP應用程序顯示查詢的內容),在Web服務器日誌中(特別是error_log) ,或者在MySQL語句或二進制日誌中。如果您的MySQL服務器不在本地計算機上,它還會通過網絡傳輸您的加密密鑰,未加密,並且將在SHOW PROCESSLIST的MySQL服務器上公開它,同時這樣的查詢正在運行。將它與固定密鑰一起使用也使得如果加密密鑰受到威脅,它幾乎不可能改變。總之,這是一個令人難以置信的安全實踐。在應用程序中進行加密,而不是數據庫!現在


,我已經得到了這一點的方式,你想要的是AS列修改:

SELECT AES_DECRYPT(...) AS decrypted_data FROM ... 

這將列重命名爲decrypted_data。 (或任何你喜歡的。)