我的代码工作得很好。但后来我决定在将值存储到数据库之前加密值。我在将数据存储到数据库中时使用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
部分是我在将值存储到数据库之前用于加密数据的密钥。
非常感谢你总是提出有用的建议。
答案 0 :(得分:0)
首先:不要在MySQL中进行加密。将加密密钥传递到数据库引擎是不安全的,因为它很容易导致加密密钥出现在输出网页中(例如,如果你的PHP应用程序显示查询的内容,在Web服务器日志(特别是error_log
)或MySQL语句或二进制日志中。如果您的MySQL服务器不在本地计算机上,它还将通过网络未加密传输加密密钥,并在SHOW PROCESSLIST
中将其暴露在MySQL服务器上,而此类查询是运行。将它与固定密钥一起使用,如果加密密钥被破坏,也几乎无法更改加密密钥。简而言之,这是一个非常糟糕的安全实践。在您的应用程序中进行加密,而不是数据库!
现在我已经解决了这个问题,你想要的是AS
列修饰符:
SELECT AES_DECRYPT(...) AS decrypted_data FROM ...
这会将列重命名为decrypted_data
。 (或者你喜欢什么。)