php - MYSQL AES_DECRYPT 错误

标签 php mysql

我有一些数据已加密存储在我的数据库之一上。这些是我希望在数据库上加密存储的个人详细信息。加密部分(AES_ENCRYPT(fname, $key) 工作正常 - 它以加密形式存储数据,正是我想要的方式。问题是当用户返回到他们填写个人详细信息的表单以进行调整时这些详细信息。我希望他们最初输入的数据出现在各自的字段中,以便他们能够修改它们。解密返回空值,甚至什么也不返回。这是我的代码:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

$sql = "SELECT username, AES_DECRYPT(AES_DECRYPT (fname, '$key'),'$key'), 
AES_DECRYPT(AES_DECRYPT (lname, '$key'),'$key'), AES_DECRYPT(AES_DECRYPT 
(address1, '$key'),'$key'), AES_DECRYPT(AES_DECRYPT (address2, '$key'),'$key'), 
AES_DECRYPT(AES_DECRYPT (zip, '$key'),'$key'), AES_DECRYPT(AES_DECRYPT (city, 
'$key'),'$key'), AES_DECRYPT(AES_DECRYPT (country, '$key'),'$key'), 
AES_DECRYPT(AES_DECRYPT (phone, '$key'),'$key') FROM persdetails WHERE username 
= '$_username'";

$query = mysqli_query($db_conxpd, $sql);
$numrows = mysqli_num_rows($query);
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
$_u = $row['username'];
$_fname = $row['fname'];
$_lname = $row['lname'];
$_addr1 = $row['address1'];
$_addr2 = $row['address2'];
$_zippo = $row['zip'];
$_citys = $row['city'];
$_cntry = $row['country'];
$_phone = $row['phone'];

}

就解密而言,这不会返回任何结果。我知道查询的工作原理是,如果我回显所有字段,它会返回用户名。它还返回行数。就加密字段而言,没有任何返回。我在这里做错了什么?

注意: key 与我用来加密数据的 key 相同。

如果您需要更多信息,请告诉我。

感谢一百万!

最佳答案

我修复了它 - 这是输入的问题:在输入 php 收到来自表单的数据后,我使用 mysqli_real_escape_string 和 preg_replace 清理了数据,因此无论出于何种原因,数据库中都没有任何内容首先,或者它以某种方式添加了其他字符。相当奇怪,因为我将输入限制为仅数字和字母,但这是一个不同类型的问题:)无论如何,在将“cast”添加到选择查询后,它就像一个魅力!

cast(aes_decrypt(fname, '1234567') as char) as fname 等...(更改了 key )向我显示了所有数据:)

非常感谢大家的努力!

关于php - MYSQL AES_DECRYPT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920386/

相关文章:

php - 无法在 symfony 3.0.0 中生成 CRUD

PHP foreach 多次执行代码

c# - 处理与 MySql 的连接丢失

javascript - 使用ajax和jquery提交表单

php - 替换 HTML 页面中的 iPhone 表情符号

php - MySQL:仅选择集合中找到的最早日期

PHPMyAdmin 不允许连接

php - 如何选择句子的前 10 个单词?

MySQL:有没有一种方法可以更新多对多连接表而不会变得非常细化?

mysql - 创建MySQL存储过程的问题