2

ユーザーが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

残念ながら、スクリーンショットでわかるように、これは復号化されたメッセージを返しません。

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

何が原因なのか本当にわかりません。誰にもアイデアはありますか?

4

1 に答える 1

18

に更新 CASTしましたCHAR

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 | ユーザー | ... | リアルボディ |
 ------------------------------------
 | | 2 | 2 | ... | ポスト 2 |
 | | 1 | 1 | ... | 投稿 1 |

これがSQLFiddleのデモです

于 2013-08-06T06:11:33.963 に答える