好吧,我明确地选择了我的昵称,因为我对此感到困惑:
首先我加密它,然后在表格中得到一个加密的行。但是当我尝试解密它时,我得到零行作为结果集。
加密:
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数据库本身上运行。
所以,问题是两个:
但是,如果我说:
SELECT * from acceso
WHERE company = 'hola';
然后,它确实显示带有加密字的行
所以,好像它没有时间在显示它之前解密该行然后什么都不显示
答案 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')