我正在尋找一種將數據加密到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