使用aes_decrypt和fetch_assoc

时间:2014-01-22 02:11:52

标签: php mysql encryption mysqli

我的代码工作得很好。但后来我决定在将值存储到数据库之前加密值。我在将数据存储到数据库中时使用aes_encrypt加密值。我从数据库中检索/选择时使用aes_decrypt来解密值。这允许我使用列名作为关联数组的元素,但现在元素名称全部搞砸了。这是我的代码:

$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部分是我在将值存储到数据库之前用于加密数据的密钥。

非常感谢你总是提出有用的建议。

1 个答案:

答案 0 :(得分:0)

首先:不要在MySQL中进行加密。将加密密钥传递到数据库引擎是不安全的,因为它很容易导致加密密钥出现在输出网页中(例如,如果你的PHP应用程序显示查询的内容,在Web服务器日志(特别是error_log)或MySQL语句或二进制日志中。如果您的MySQL服务器不在本地计算机上,它还将通过网络未加密传输加密密钥,并在SHOW PROCESSLIST中将其暴露在MySQL服务器上,而此类查询是运行。将它与固定密钥一起使用,如果加密密钥被破坏,也几乎无法更改加密密钥。简而言之,这是一个非常糟糕的安全实践。在您的应用程序中进行加密,而不是数据库!


现在我已经解决了这个问题,你想要的是AS列修饰符:

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

这会将列重命名为decrypted_data。 (或者你喜欢什么。)