好吧,我绝对正确地选择了我的昵称,因为我对此感到困惑:
首先,我对其进行加密,然后在表中得到一个加密行。但是当我尝试解密它时,结果集为零行。
加密:
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数据库本身上运行的。
所以,问题有两个:
- 不显示任何数据有什么问题
- ..."$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')