我正在寻找一种将数据加密到MySQL数据库的方法,并在出口时将其解密。此外,我希望能够对这些字段执行正常的SQL查询,例如搜索和比较,这使我无法使用纯PHP解决方案。MySQL的AES_DECRYPT问题
这导致我使用AES_ENCRYPT()和AES_DECRYPT(),它可以使用MCRYPT在PHP中复制。
我很难与AES_DECRYPT并尝试所有建议,我可以通过在线搜索找到。
这里是我的表:
CREATE TABLE IF NOT EXISTS `test_table` (
`id` int(6) NOT NULL,
`secure_info` text NOT NULL,
`encrypted_blob` blob NOT NULL,
`encrypted` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我执行这些查询:
INSERT INTO test_table (id, secure_info) VALUES (1,'Testing');
UPDATE test_table SET encrypted = AES_ENCRYPT(secure_info,'key') WHERE id=1 LIMIT 1;
UPDATE test_table SET encrypted_blob = AES_ENCRYPT(secure_info,'key') WHERE id=1 LIMIT 1;
SELECT *, AES_DECRYPT(encrypted,'key') as decrypted, AES_DECRYPT(encrypted_blob,'key') as decrypted_blob FROM test_table WHERE id=1;
我无法得到原始值。 'decrypted'返回NULL,'decrypted_blob'返回54657374696e67
任何想法,或者更好的解决方案?
所有加密是通过定义可逆的。您使用密码混淆了消息摘要功能。翻译md5()不加密其散列函数。 – rook 2010-09-16 01:51:42
如果你只是想存储加密值,你应该用PHP加密它们并将它们写成斑点。这样,密钥永远不会离开PHP,因此数据库对攻击者无用。你似乎在做的是在数据库中进行加密和解密,这提供了更少的保护。毕竟,您现在必须通过每条查询在电线上发送(纯文本!)键。最后,Rook有一点,因为如果你存储密码而不是加密,你应该使用摘要。 – 2010-09-18 02:09:26