• ベストアンサー

MD5について

perlでmd5化したパスワードをpostgreSQLに格納し、認証時に使用するような処理をしています。 色々と当たってみると、md5化されたパスワードは半角英数の文字列になるようなのですが、実際にDBに登録されている文字列をteratermでselectしてみると2バイト文字(こんな感じ→`Tz祀・旅[綻)として見えます。 そんなことってあるんでしょうか? PostgreSQL7.4でDBのエンコードはSQL_ASCII。 teratermはEUCのまま使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • struct
  • ベストアンサー率72% (32/44)
回答No.1

PostgreSQLを知らないので抜けがあるかもしれませんが、 おそらくバイナリとテキストの違いでそう見えるのでしょう。 「md5化されたパスワードは半角英数の文字列」とありますが 正確には128ビットの長さの0と1です。 これをコンピュータの1バイトにめいいっぱい割り当てると 128÷8で、16バイトのデータになります。 このデータはテキストではなくバイナリなので、 無理やり文字(Shift_JIS)として画面に表示させると、 l5コ・q:・連」ナォキ{ のように見えます。 人間が目で見て比較する場合、 128個の0と1を比較するわけにはいきませんから、 ハッシュ値を128桁の2進数と見て、 それを16進数に変換します。 そうすると32桁になり少しは比較しやすくなります。 使う数字は0123456789abcdefの16個で、 一例を挙げると、 6c35bafcb0713aeb439841a3c5abb77b といった感じです。 通常よく見かける表記はこちらでしょう。 最後にSQLの結果を16進数表記にするにはどうしたらいいのかという疑問がわくかもしれませんが、 画面をリダイレクトか何かでファイルに落とし、 バイナリエディタで見るぐらいしか思いつきませんでした。

northwind3
質問者

お礼

結局は同じものとして考えてよいわけですね。 なるほど。 ありがとうございました。

その他の回答 (1)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。概ね#1さんが回答されているので、補足を。 バイナリ情報であれば、BASE64というエンコードも便利です。googleあたりでお調べになってみるとよろしいかと。 あと、MD5は、身内で「マジでダメになる5秒前っていうかダメ」って冗談を言っているくらい、ハッシュ関数としてはNGな方式です。 sha-1…が良いかどうかは微妙ですが、MD5よりはマシですので。せめてもsha-1になさることをお勧めいたします。

northwind3
質問者

お礼

そうなんですかー。 もうすでにサービスが稼動してしまっているので簡単ではないかもしれませんが、検討事項としてsha-1への移行も考えておきます。 ありがとうございます。

関連するQ&A

  • ハッシュ化するとDBに登録できない

    認証に使用するパスワードをmd5で暗号化してDBへ登録する処理をしています。 その際、暗号化後の文字列に”\r”という文字が入り、DBに登録できないという事象が発生しています。 そう多く発生している訳ではないようなのですが…。 そんなケースに当たった方、いらっしゃいますでしょうか? その場合、どうやってそれを回避されましたか? perlは5.8.5、PostgreSQLは7.4.13です。

    • ベストアンサー
    • Perl
  • 文字コード

    ある変数$aaaに文字列が入ってくるのですが $code = getcode( $aaa ); で文字コードを調べると、asciiと返ってきます。 文字コードをeucに変換したいので Jcode::convert(\$aaa,'euc'); としても文字コードはasciiのままです。 どのようにしたら eucに変換できるのでしょうか?

    • ベストアンサー
    • Perl
  • 拡張文字のチェック

    ファイルから文字列データを読み込んでDBに格納する再に 文字列データ内に第二水準及び、拡張文字が入っていたらNGを出すというチェックをしたいのですが、うまいこといかずに詰まってしまいました。 今のところ正規表現で該当文字をSJISのコードで指定してるのですが思ったとおりになりません。 環境は 読み込みファイルはSJIS、DBはEUC PHP4.3.9 DBはPostgresです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • ASCII文字列をEUCなどに変換したいができない

    いつもお世話になっております。 ファイルの文字コードがEUCのファイルの中に、 なぜか、文字コードがASCIIである文字列があります。 この文字列は、外部から受け取るカタチなので、 これはこれで、ASCIIでも、しかたないのかなという風に思い、 それならば、受け取った後、EUCに変換すればいいやと考え、 mb_convert_encoding($var,"EUC-JP","ASCII")を使って、変換を試みるも、 ASCIIのままなのです。 ASCIIである文字列には、変換されない鉄壁さというものがあるのでしょうか? 変換処理後に、mb_detect_encoding()で検査しますが、やはりASCIIのままです。 それならば!、ということで、 受け取る値(ここでは例として、"This_Value_is_ASCII_Encoding_hogehoge9999")を いったん手動のコピペ操作をして、 $UketoruAtai = "This_Value_is_ASCII_Encoding"; とし、 その値もやはり、ASCII文字列になっているので、 この、手動コピペ文字列ならば文字コードの変換はできるだろうと思い、 上記のmb_convert_encoding()の処理をしたわけですが、 この場合でも、やはり ASCIIは鉄壁でした。 いったい、これは、なんなんでしょうか、、、。 ちなみに、このASCII文字列は、英数字のみ(当たり前か。笑)の文字列です。 このASCII文字列を、EUC-JPにする手助けを、どなたか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPの文字化け回避方法

    PHPとDB(MySQL)を使用したアプリケーションを作成しています。 しかし特定の文字(表や能など)をDBに入力し再度PHPで表示すると文字化けします。 調べて対策を行いましたが改善されません。 (対策) DBに格納する前にデータをすべてmb_convert_encoding($goo, "EUC-JP", "SJIS");でエンコード 読み込む際にはmb_convert_encoding($goo, "SJIS", "EUC-JP")と戻す。 又、magic_quotes_gpcもoffに。 しかしながら一向に改善されません。どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字コードエラー

    PostgreSQLを使用したいのですが、 新しいデータベースをサブホストドメインに対して付与及び、追加する際に、 文字エンコードがデフォルトでは「SQL_ASCII」になっているのを「EUC-JP」に変更したいのですが、どうすればいいのでしょうか?

  • pg_dumpの文字化け

    PostgreSQLのpg_dumpを用いたバックアップで困っています。 OSはVineLinux 2.2.17-0vl10です。 あるサーバ(PostgreSQL7.0.2)のデータベースtest_db(EUC_JP)に対して、 pg_dump -D -v -i -f test.dump test.db でダンプファイルを作成しました。 COPYでは不確実な場合があるということでINSERT文で出力しました。 (データの日本語の部分が数字に変換されています) それを別のサーバ(PostgreSQL8.2.5)のデータベースtest2_db(EUC_JP)にリストアしました。 psql test2_db < test.dump すると、"(株)"という文字を含む文字列が化けてしまっていました。 同じレコードの他のカラムは大丈夫です。 このような場合の対策がありましたら教えていただきたいと思います。 宜しくお願いします。

  • postgresのパスワードの変更?

    PHP+PostgreSQLで開発しているのですが、PostgreSQLのパスワードがわかりません。 まず、PostgreSQLのユーザー(postgres)を作成して、パスワードも設定しinitdbでデータベースを初期化しDBを作っていました。 そしてそのDBを作っていた人が突然夜逃げしてしまったのでpostgresのパスワードがわからなくなってしまい、そこでroot権限でパスワードをpasswdコマンドで変更したのですがDBにpostgresでアクセスできません。 [admin admin]$ su - postgres Password: [postgres pgsql]$ psql -d test Password:←ここでは新たに変更したパスワードを入力しました psql: FATAL 1: Password authentication failed for user "postgres" となります。initdb後にpostgresのパスワードを変更した場合は前に設定されていたパスワードを入力しなければならないのでしょうか? またパスワードを調べる手立てはないでしょうか? List of databases Name | Owner | Encoding -----------+----------+----------- test | postgres | SQL_ASCII template0 | postgres | SQL_ASCII template1 | postgres | SQL_ASCII DBの中はこのようになっています。 宜しくお願いします。

  • DB内にMD5でハッシュ化されたパスワードとの照合

    MySQLのDBにMD5でハッシュ化されたパスワードが格納されているのですが、これをPerlのスクリプトで照合したいと思っています。 具体的には、DBに格納されているパスワードを用いて、Perlで作成された会員専用ページなどにログインをするといった感じです。 DBIを用いてDBからの情報を取得することはできたのですが、Perl側での対処がわかりません。 Perl側で入力されたパスワードをハッシュ化して、双方を照合するなどの情報を見たのですが、いまいち解らず認証することができませんでした。 以下にパスワードに関する部分のソースを記載させていただきます。 srand(); @salt = ( "A".."Z", "a".."z", "0".."9", ".", "/" ); $salt = '$1$' . join('', map($salt[int(rand(64))], 1..8)) . '$'; $pass = crypt($in{'pass'}, $salt); crypt($in{'pass'},$ary) eq "$ary") ※$aryはDB内に格納されているパスワードです Perlに関して殆ど解っていないもので、とんちんかんな記述かもしれませんが、ご教授いただけますと幸いです。 宜しくお願いいたします。

  • 文字エンコードの変更方法

    Linuxサーバーで、PostgreSQLを使用したいのですが、 新しいデータベースを追加する際に、 文字エンコードがデフォルトでは「SQL_ASCII」になっているのを「EUC-JP」に変更したいのですが、どうすればいいのでしょうか? ちなみに、Pleskコントロールパネルは使えます。