2013-08-06 17 views
1

我正在創建一個系統,用戶可以通過PHP使用MySQL數據庫存儲消息,並且我正在使用MySQL AES_ENCRYPT函數來加密這些消息的內容。在MySQL中使用帶有ORDER子句的AES_DECRYPT返回的BLOB數據

這是我帖子表:

CREATE TABLE IF NOT EXISTS `posts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user` int(11) DEFAULT NULL, 
    `group` int(11) DEFAULT NULL, 
    `body` varbinary(1000) NOT NULL, 
    `ip` varchar(45) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `replyto` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `replyto` (`replyto`), 
    KEY `user` (`user`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 


ALTER TABLE `posts` 
    ADD CONSTRAINT `posts_ibfk_3` FOREIGN KEY (`replyto`) REFERENCES `posts` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    ADD CONSTRAINT `posts_ibfk_4` FOREIGN KEY (`user`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE; 

而且我用戶表:

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `ip` varchar(45) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `email` varchar(100) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `hash` varchar(128) NOT NULL, 
    `salt` varchar(32) NOT NULL, 
    `guid` varchar(36) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

我使用郵件正文中的AES加密密鑰是SHA-512前綴和後綴字符串之間的加粗連接,以及在中間發佈用戶的GUID。因此,我有以下SQL查詢來選擇最新的消息:

SELECT AES_DECRYPT(`posts`.`body`, SHA2(CONCAT('prefix',(`users`.`guid`),'suffix'),512)) AS 'realbody' 
FROM `posts` 
INNER JOIN `users` ON `posts`.`user` = `users`.`id` 
ORDER BY `posts`.`id` DESC 

不幸的是,這不返回已解密的消息,你可以在截圖中看到:

https://i.imgur.com/N1B1iqR.png

相反,我得到這個BLOB數據。但是,如果我從查詢中刪除order by子句:

SELECT AES_DECRYPT(`posts`.`body`, SHA2(CONCAT('prefix',(`users`.`guid`),'suffix'),512)) AS 'realbody' 
FROM `posts` 
INNER JOIN `users` ON `posts`.`user` = `users`.`id` 

突然,它的工作原理:

https://i.imgur.com/6ArQPHN.png

我真的不知道這可能是導致此。有人有任何想法嗎?

回答

5

修訂CASTCHAR

SELECT `posts`.*, CAST(AES_DECRYPT(`posts`.`body`,SHA2(CONCAT('prefix',`users`.`guid`,'suffix'),512)) AS CHAR) as 'realbody' 
    FROM `posts` JOIN `users` 
    ON `posts`.`user` = `users`.`id` 
ORDER BY `posts`.`id` DESC 

輸出示例:

 
| ID | USER | ... | REALBODY | 
---...------------------------ 
| 2 | 2 | ... | Post 2 | 
| 1 | 1 | ... | Post 1 | 

這裏是SQLFiddle演示

+0

沒想好,但不幸的是我仍然有同樣的問題。 –

+0

@WilliamThomas你可以用幾行樣本數據創建一個sqlfiddle嗎? – peterm

+0

我只是做了,但不幸的是它看起來像二進制數據不管是什麼:http://sqlfiddle.com/#!2/4ccd9a/4/0 –