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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3430閲覧

【php】【Mcrypt】MysqlのDBに保存したら文字化けor値が変わってしまいます。

gogoackman3

総合スコア109

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/09/13 18:02

編集2016/09/14 01:00

【追記】

暗号化及び復号化させる処理は以下の通りになっています。

php

1 static function new_digest ($token) { 2 $key = 'sfajeowif239jkljifw7'; 3 4 /* モジュールをオープンし、IV を作成 */ 5 $td = mcrypt_module_open('des', '', 'ecb', ''); 6 $key = substr($key, 0, mcrypt_enc_get_key_size($td)); 7 $iv_size = mcrypt_enc_get_iv_size($td); 8 $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 9 /* 暗号化ハンドルを初期化 */ 10 if (mcrypt_generic_init($td, $key, $iv) != -1) { 11 12 /* データを暗号化 */ 13 $digest = mcrypt_generic($td, $token); 14 mcrypt_generic_deinit($td); 15 16 /* 後始末 */ 17 mcrypt_generic_deinit($td); 18 mcrypt_module_close($td); 19 return $digest; 20 } 21 } 22 23

php

1 static function restore_digest ($digest) { 2 $key = 'sfajeowif239jkljifw7'; 3 4 /* モジュールをオープンし、IV を作成 */ 5 $td = mcrypt_module_open('des', '', 'ecb', ''); 6 $key = substr($key, 0, mcrypt_enc_get_key_size($td)); 7 $iv_size = mcrypt_enc_get_iv_size($td); 8 $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 9 /* 暗号化ハンドルを初期化 */ 10 if (mcrypt_generic_init($td, $key, $iv) != -1) { 11 12 13 /* 復号のため、バッファを再度初期化 */ 14 mcrypt_generic_init($td, $key, $iv); 15 $token = mdecrypt_generic($td, $digest); 16 17 /* 後始末 */ 18 mcrypt_generic_deinit($td); 19 mcrypt_module_close($td); 20 return $token; 21 } 22 }

【質問】

上記Mcryptで暗号化した文字列をMysqlのDBに格納すると、値が変わってしまいます。

そもそも暗号化した段階で、その値をそのままvar_dumpで確認すると以下のような文字化けした値になります。

string(40) "��4AwbAX��_;�5 �XZ�jgs��/�y:���Xp�U"

さらにこの値をDBに格納(カラムのデータ型はtinytextにしています)すると、":"とか"z"とかよく分からない凄く短い文字列になります。

この凄く短い文字列をDBから取り出して、復号化しても元の値と一致しません。

しかしながら、前者の文字化けしたものをDBに格納せずにそのまま復号化すると、元の値と一致します。

やりたい事としては、Mcryptで暗号化した値をDBに格納し、それを取り出して復号化して元の値と一致しているかどうか判定する事です。

①そもそも暗号化直後にvar_dumpした段階で文字化けしているのが問題なのでしょうか?
②それは関係なく、DBに格納した際に、凄く短い値に変わってしまうのが問題なのでしょうか?

mysqlの文字コードなどの問題なのでしょうか??
ご教示頂けると大変助かります。

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

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

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

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

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

popobot

2016/09/13 20:39

どの関数を使って暗号化したのでしょうか。できればコードも記載きてください。
gogoackman3

2016/09/14 01:01

本文の最上部にコードを追記させて頂きました。ご確認頂けると嬉しいです!
guest

回答1

0

ベストアンサー

暗号化したデータはバイナリになっているので、base64_encodeでテキストに変換して表示すると良いと思います。
同じく、データベースに保存する際もbase64_encodeした値を入れておくと、運用しやすくなると思います。

投稿2016/09/14 01:14

moonphase

総合スコア6621

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

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

gogoackman3

2016/09/14 01:30

ありがとうございました!無事問題なくDBに格納出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問