AES en-and解密PHP MySQL

时间:2012-05-25 18:16:22

标签: php aes

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

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

加密:

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 ..”的版本是否有效。
  3. 但是,如果我说:

    SELECT * from acceso 
    WHERE company = 'hola';
    

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

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

2 个答案:

答案 0 :(得分:2)

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

这不起作用,因为你告诉MySQL解密常量字符串“username”,而不是username列的值。删除'username''email'上的引号。

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

这里的问题相同。但是,为了利用指数,以相反的方式做到这一点会更有效率:

where company = AES_ENCRYPT(?, 'capullo')

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

答案 1 :(得分: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')