AES en-and decrypt PHP MySQL


AES en-and decrypt PHP MySQL

好吧,我绝对正确地选择了我的昵称,因为我对此感到困惑:

首先,我对其进行加密,然后在表中得到一个加密行。但是当我尝试解密它时,结果集为零行。

加密:

INSERT INTO accesobases (company, username,email) VALUES
 ('hola',
AES_ENCRYPT('pedro','capullo'),
AES_ENCRYPT('myemail',' capullo')
);

当我运行解密查询时,显示 0 行。

SELECT company,
AES_DECRYPT('username', 'capullo'),
AES_DECRYPT('email', 'capullo')
from acceso
where company = 'hola';

请注意,我没有加密公司,但我肯定需要加密,但我想看看它可能在哪里出现错误。也就是说,即使不偏离非加密单词(公司 = hola),我也会得到任何结果。因此,当我尝试执行以下操作时,情况会更糟:

where AES_DECRYPT ('company', 'capullo') = ' " . $company . " '

这就是它在我的PHP页面上的样子。上面的块是在MySQL数据库本身上运行的。

所以,问题有两个:

  1. 不显示任何数据有什么问题
  2. ..."$company.."的版本是否有效。

但是,如果我说:

SELECT * from acceso 
WHERE company = 'hola';

然后,它确实显示带有加密单词的行

因此,就好像在显示行之前没有时间解密该行,然后什么也不显示

SELECT company,
AES_DECRYPT('username', 'capullo'),
AES_DECRYPT('email', 'capullo')
from acceso
where company = 'hola';

这是行不通的,因为你告诉MySQL解密常量字符串"用户名",而不是username列的值。删除 'username''email' 上的引号。

where AES_DECRYPT ('company', 'capullo') = ' " . $company . " '

同样的问题在这里。但是,反过来这样做会更有效,以便利用指数:

where company = AES_ENCRYPT(?, 'capullo')

话虽如此,在MySQL服务器端使用AES_ENCRYPT并不安全。加密密钥随每个查询一起传递给服务器,因此将出现在 MySQL 进程列表中,也可能出现在服务器查询、慢速和/或错误日志中;如果您没有将SSL用于MySQL连接,则它们将以明文形式通过网络传递,解密的数据也是如此。

这些是列名,所以不要把它们放在引号里:

AES_DECRYPT('username', 'capullo'),
AES_DECRYPT('email', 'capullo')

请改为执行以下操作:

AES_DECRYPT(username, 'capullo') AS username,
AES_DECRYPT(email, 'capullo') AS email

此外,由于 AES_ENCRYPT 的输出是二进制的,因此请确保您的列是二进制的。

看起来您可能有两个不同的表,"accesobases"和"acceso",因此请确保您使用的是正确的表。

您的陈述:

where AES_DECRYPT (company, 'capullo') = ' " . $company . " '

似乎没问题,只要您也从此处的列名称中删除引号即可。它会很慢,因为它无法使用索引。相反,您应该这样做:

where company = AES_ENCRYPT('$company', 'capullo')