質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

2346閲覧

Mysql5.7でutf8mb4のレコードをAES_ENCRYPTを使用して登録したい

spell

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/07/18 03:36

前提・実現したいこと

AES_ENCRYPTを使用してレコードを挿入したい。

DATABASE:sandbox TABLE:tests
mysql> show create database sandbox; +----------+------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------------------------------------+ | sandbox | CREATE DATABASE `sandbox` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ | +----------+------------------------------------------------------------------------------------------------+ mysql> show create table tests; +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+ | tests | CREATE TABLE `tests` ( `name` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+

発生している問題・エラーメッセージ

ERROR 1366 (HY000): Incorrect string value: '\x8D\x91\x82-\xFFB...' for column 'name' at row 1

該当のソースコード

mysql

1INSERT INTO tests ( `name` ) VALUES ( AES_ENCRYPT( 'hoge', '123456' ) );

試したこと

CentOS7.6のmysql5.7でcharacter setをutf8mb4でcollationはutf8mb4_unicode_ciに設定しました。
my.cnfの内容は

[mysqld] character_set_server=utf8mb4 collation_server=utf8mb4_unicode_ci datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] default-character-set = utf8mb4

となっています。

mysqlで

mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+

となっているので特に問題はないと思われます。

mysql

1INSERT INTO tests (`name`) VALUES ( 'hoge' );

だとレコードは登録されます。

文字コードが不整合なエラーだと思いますが、何処を確認したら良いでしょうか。

補足情報(FW/ツールのバージョンなど)

CentOS Linux release 7.6.1810 (Core)
mysql Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using EditLine wrapper

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

実際使用していない上、未検証のエア回答です。

AES_ENCRYPT(str,key_str[,init_vector])

AES_ENCRYPT() encrypts the string str using the key string key_str and returns a binary string containing the encrypted output.

上記の通り、binary string が返るとあり、「 VARBINARY or BLOB 」が推奨されています。

ただ、推奨ってだけでダメって書いてないんですよねぇ。。。外れな気がします^^;

気になる機能なんで回答付けました。
誰か良い回答してくれるとよいのですが^^;

投稿2019/07/18 04:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spell

2019/07/18 04:26

回答ありがとうございます。 結局HEXとUNHEXとCONVERTで対応する事にしました。
退会済みユーザー

退会済みユーザー

2019/07/18 04:49

HEX 使用するのってアンチパターンな気がするんですよねぇ。。。 未検証回答なんで、ただの勘ですが。
guest

0

自己解決

AES_ENCRYPTをする際にHEXをしAES_DECRYPTをする際にUNHEXしてレコードの挿入閲覧が出来るようになりました。

mysql

1mysql> INSERT INTO tests ( `name` ) VALUES ( HEX( AES_ENCRYPT( 'hoge', '123456' ) ) ); 2Query OK, 1 row affected (0.01 sec) 3 4SELECT CONVERT( AES_DECRYPT(UNHEX(name), '123456' ) USING utf8mb4 ) FROM tests; 5+-------------------------------------------------------------+ 6| convert( AES_DECRYPT(UNHEX(name), '12345' ) USING utf8mb4 ) | 7+-------------------------------------------------------------+ 8| hoge | 9+-------------------------------------------------------------+ 101 row in set (0.00 sec)

投稿2019/07/18 04:25

spell

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

blobとかにしておけばよいのでは?

SQL

1CREATE TABLE `tests` ( 2 `name` blob DEFAULT NULL 3); 4INSERT INTO tests (name) VALUES (AES_ENCRYPT('hoge','123456')); 5select AES_DECRYPT(name,'123456') from tests;

追記

検索性もないのに無駄にvarcharを使う意味がわかりませんが、仕様なら仕方ないですね
すでにご自身で書いてありますがhex-unhex,aes_encrypt-aes_decryptで処理します

SQL

1CREATE TABLE tests ( 2 `name` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL 3) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 4 5INSERT INTO tests (name) VALUES (HEX(AES_ENCRYPT('hoge','123456'))); 6select AES_DECRYPT(UNHEX(name),'123456') from tests;

投稿2019/07/18 04:00

編集2019/07/18 04:30
yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spell

2019/07/18 04:21

回答ありがとうございます。 要件としてvarcharでとの事なので、blobを使用は出来ないです。
spell

2019/07/19 04:33

検索対象との事なのでlike検索するためvarcharになっているようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問