PHPにてmcrypt_genericを利用しパスワードを暗号化して格納したいと思っています。


プログラムソースはUTF-8です。

このときに、暗号化後の文字列を正常にデータベースに格納するにはどうすればよいでしょうか?

データベースに格納領域として「VARCHAR」型で確保してインサートすると、正常にインサートされません。
症状としては一部の文字(1文字か2文字程度)しかインサートされません。

画面にechoにて出力した場合はもっと沢山の文字列があるのですが、なぜDBには格納できないのでしょうか?

データベース側の型指定があやまっているのでしょうか?

前提として、普通の文字列や数値データ等は
文字化けなくMySQLに対して読み書きできております。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2007/08/14 02:03:10
  • 終了:2007/08/15 10:46:18

回答(4件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/08/14 02:17:44

ポイント30pt

http://phpspot.net/php/man/php/function.mcrypt-generic.html

参考になるでしょうか?

確認済みなら申し訳ありません。

DBの型とデータの中身のあたりに問題があると推測します。

本当に、ここのページを読んだ感触と質問に書いている

結果をみての推測です。

id:curd

VARCHAR型で最後の空白を削除し試しましたが、

やはりだめでした。

DBインサート前であれば暗号化、復号化ともに問題ないので、インサートの問題だとは思うのですが、もう少し読んでみます。

ご回答ありがとうございました。

2007/08/14 03:15:37
id:xxxatsxxx No.2

xxxatsxxx回答回数45ベストアンサー獲得回数22007/08/14 02:18:51

ポイント15pt

マニュアルに

MySQL データベースにデータを格納する場合は、 varchar フィールドに値を挿入する際に末尾のスペースが取り除かれることを 覚えておきましょう。暗号化されたデータの最後にスペース(ASCII 32)が 含まれていた場合、この処理によってデータが破壊されてしまいます。 かわりに tinyblob/tinytext (あるいはより大きな) フィールドを 使用してください。

とあるので、とりあえず、tinytextかtextを利用してみた方がいいのだと思います。

http://manual.xwd.jp/function.mcrypt-generic.html

id:curd

TINYTEXT及びTEXTで試しましたがだめでした。

もう少しいろいろ試してみます。

ご回答ありがとうございました。

2007/08/14 03:15:38
id:xxxatsxxx No.3

xxxatsxxx回答回数45ベストアンサー獲得回数22007/08/14 03:39:03

ポイント15pt

試しに、mysql_connectしてmysql_queryでインサートして、取り出してみましたが、問題ありませんでした。

もしかして、PEAR::DBなどのラッパーを利用されていますでしょうか?クオートなどで余計な事をされているかもしれませんので、

ご利用のライブラリ等明記してもらえるとありがたいです。

ちなみに前にDB_DataObjectでmcrypt_generic使った気がしますが、問題なかったはずです。

http://manual.xwd.jp/function.mcrypt-generic.html

id:curd

mysql_connectしてmysql_queryしております。

何かしら根本的に間違っているのですかね(汗

2007/08/14 09:39:08
id:KUROX No.4

KUROX回答回数3542ベストアンサー獲得回数1402007/08/14 08:56:35

ポイント30pt

・DBは、UTF-8、SJIS、EUC-JPのどれでしょう。

・別のツールとかで該当文字列がINSERTできるかはどうでしょう

・INSERTする前のデータを、16進で表示して、文字列と

 してみた場合、不自然なものはないでしょうか?

http://q.hatena.ne.jp/answer

id:curd

原因が徐々にわかってきました。

そもそも、DB云々の前に暗号化・復号化の関数を作成した際に、初期化を毎回していたのですが、

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);

上記を暗号化及び復号化の際にそれぞれ呼び出している為、復号化に失敗しているのがまずは問題だとわかりました。

※つまり、DBに格納できるのか、できないのかという問題は解決していないのですが、そもそも復号化に失敗しているのは、別な要因だったということがわかりました。

通常暗号化の際の初期化ベクトルIVはDBや設定ファイルに保存しておいて共通のものを使うべきなのでしょうか?

2007/08/14 10:53:21
  • id:curd
    とりあえず、そもそもの暗号化・復号化の問題は解決しました。

    しかし、やはりDBにインサートできません。

    暗号化文字列を$EncStrとした場合、
    そのままインサートするとエラーとなる為、
    mysql_real_escape_string()にてエスケープしインサートしますが、
    インサートされている文字は途中で途切れています。。。

    ソースはUTF-8、データベースもUTF-8です。

    同じ文字列をDBに格納せずに暗号化・復号化してもなんら問題ありません。

    ちなみに、確認としては、
    一本のソース内で試験的に、

    ①暗号化文字列の生成(外部関数の呼び出し)
    ②エスケープ処理
    ③データベースへインサート
    ④インサートに利用した文字列を復号化し出力
    ⑤DBをSELECTした結果の文字列を復号化し出力

    上記の流れで試していますが、
    ⑤の出力内容が正常に出力されません。

    ためしに、暗号化された文字列を、
    DBにインサートする前とした後で比較しましたが、
    やはりDBに入れた時点でデータが欠落しているらしく、
    ぜんぜん一致しません。

    なぜインサートするとデータが欠落するのでしょうか・・・
    わたしの環境はXREAサーバですが、サーバ側の設定の問題なのでしょうか・・・
  • id:curd
    解決いたしましたので終了としました。

    結論は、暗号化したデータを格納するMySQL側のフィールドを
    BLOB型にすることで正常となりました。

    予断ですが、TEXT型、TINYTEXT型ではエラーとなりました。。。

    ご協力いただいた皆様本当にありがとうございました。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません