mysql - 使用带 ORDER 子句的 AES_DECRYPT 在 MySQL 中返回的 BLOB 数据

标签 mysql database sql-order-by blob aes

我正在创建一个系统,用户可以在其中使用 MySQL 数据库通过 PHP 存储消息,我正在使用 MySQL AES_ENCRYPT 函数来加密这些消息的内容。

这是我的帖子表:

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 加密 key 是前缀和后缀字符串之间的 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

我真的不知道是什么原因造成的。有人有什么想法吗?

最佳答案

UPDATED 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 演示

关于mysql - 使用带 ORDER 子句的 AES_DECRYPT 在 MySQL 中返回的 BLOB 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18072379/

相关文章:

postgresql - 按 UUID 排序在 PostgreSQL 中如何工作?

mysql - 如何在低规范系统的大表上提高 MySQL 性能?

php - 我可以使用mysql_free_result()和mysql_close()吗?

mysql - 导出到 excel 后显示不同的值

mysql - 如何从架构中的每一列获取示例值

python - 将条目存储在一个非常大的数据库中

php - 无法从 webservice ionic 框架检索数据

database - Visual Studio 2008 中的 PostgreSQL 数据连接/服务器资源管理器

mysql - 从 mysql 数据库中选择一些内容并按计数(其中)排序

mysql - LIKE mysql 按搜索词查询顺序