0

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

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

加密:

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';

然后,它确实显示了带有加密字的行

所以,就好像它没有时间在显示之前解密该行然后什么都不显示

4

2 回答 2

2
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 连接,它们将以明文形式通过网络传递,解密数据也是如此。

于 2012-05-25T18:22:59.457 回答
1

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

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')
于 2012-05-25T18:22:20.487 回答