java aes mysql blob_使用带有ORDER子句的AES_DECRYPT在MySQL中返回BLOB数据

用户在尝试使用PHP和MySQL通过AES_ENCRYPT函数加密消息内容时遇到问题。当在查询中加入ORDER BY子句时,解密后的消息显示为BLOB数据,而移除该子句后能正常解密。问题可能与排序操作和加密密钥的使用方式有关,可能需要进一步调查MySQL如何处理排序和加密的组合情况。
摘要由CSDN通过智能技术生成

我正在创建一个系统,用户可以通过PHP使用MySQL数据库存储消息,我使用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加密密钥是前缀和后缀字符串之间的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

不幸的是,这不会返回解密的消息,您可以在屏幕截图中看到:

mLnnQ.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`

然后突然,它工作:

Pny6G.png

我真的不知道是什么原因引起的.有人有什么想法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值