• ベストアンサー

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

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

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
noname#25358
noname#25358
回答No.3

>postgreSQLでのバイナリ型というとbyteaでしょうか。  そうです。 >既に登録されているデータがある前提でいくと、どの方法がよいのでしょうか。  どのみち「テーブルを作り直して全て登録しなおし」「既存データへパッチを当てる」のうちどちらかの方法を取ることにはなります。  それを考えたとき、手間が少ないのは後者の方法でしょう。  既存のデータを取り出し、変換して登録しなおすだけのためのプログラムを用意する方法です。  ちなみに、Base64 エンコードを使う方法はややメジャーな類の対策法ですが、既存の変換ロジックが使えなければ手間が増大する欠点があります。  もしすでにエンコードロジックが手元にあるなら、この方法を用いるのが簡単でよいでしょう。フリーの変換モジュールを使う手もあります。  でもそれが使えないならば、変換・復元ロジックは自分で作ることになります。そうなったときは、2バイト1組の16進文字列に変換してしまう方法が、単純でよいと思います。

northwind3
質問者

お礼

返信が遅れてすみません。 ご回答、ありがとうございました!

その他の回答 (2)

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

がると申します。概ね#1と同様ですが、バイナリに関してはもう1手段あるので。 ・Base64エンコードを行う バイナリが簡単に文字列になるので、割合に重宝します。 ただ。MD5でのハッシュ化は…あまりお勧めしません。せめてsha-1をお使いになられることを強くお勧めいたします。

northwind3
質問者

お礼

返信が遅れてすみません。 ご回答、ありがとうございました!

noname#25358
noname#25358
回答No.1

 MD5は、エンコードするとバイナリ文字列を生成します。  通常は下記のうちいずれかの方策を採ります。 1.データベースの項目をバイナリ型にする 2.MD5をさらに、0~9とA-Fだけの16進数文字列に変換する  もう少しだけならもっと詳しい話もできます。  分からない点があれば補足に書いてください。

northwind3
質問者

補足

ありがとうございます。 お言葉に甘えて補足させてもらいます。 ○postgreSQLでのバイナリ型というとbyteaでしょうか。 ○既に登録されているデータがある前提でいくと、どの方法がよいのでしょうか。

関連するQ&A

  • MD5について

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

  • 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に関して殆ど解っていないもので、とんちんかんな記述かもしれませんが、ご教授いただけますと幸いです。 宜しくお願いいたします。

  • addslashesを使用したDBの登録内容

    <input type='text'・・の入力フィールドを含むPHPファイルを作成しました。このフィールドで入力された値を受け取りDB(postgreSQL)にinsertします。 この値を登録する前に、addslashes関数を通しています。 入力値:\500とした場合 DB(psqlコマンドでselectした)値:\\500 となるかと予想していたのですが、 (実際にバックスラッシュを挿入した文字列がDBに登録されるのかとおもっていました) DB(psqlコマンドでselectした)値:\500 と登録されます。 この登録内容が正常動作なのでしょうか。 addslashesを通さずにinsert文を発行すると、確かにDBエラーとなるので、addslashesは有効にはなっているかと思います。 長文で申し訳ありません。宜しくお願いいたします。 PHP 4.3.4 postgreSQL 7.3.6 php.ini のmagic_quotes_gpc = Off の環境です。

    • ベストアンサー
    • PHP
  • 一般的なセキュリティ(暗号化)

    こんにちは、Perlを始めて2週間の者です。 只今、認証ページを勉強&作成中です。 IDとPASSに関しては暗号化して認証することを考えていますが、 crypt関数で暗号化すると、8文字以降は切り捨てられるとのことなので、 入力文字列を8文字で区切り、それぞれを暗号化した後に結合して 1つの暗号化された文字列を生成しました。 8文字以上の(文字数が多い)方が安全性が増すという意味合いからです。 また、入力値を暗号化する前に、reverseで逆順にしたりしましたが、 こういった処理には(文字数を増やしたり、逆順にする)意味がありますか? (さほど、セキュリティ強度は変わらないのでしょうか?) また、完全な暗号化は存在しないと承知の上ですが、MD5等も 強度が低いと聞きました。 通常、認証時のデータはどのようなセキュリティを施すべきですか? (○○○をすれば十分というものは?)

  • パスワードのハッシュ化について

    ユーザー登録させるようなwebサイトを作ることになりました。 ググッたところパスワードはハッシュ化させDBへ、っていうのが通常らしいんで、 sha256を使って変換しようと思います。 質問(1)ハッシュ化させる元の文字列には文字数など何か制限はないんでしょうか。 質問(2)ハッシュ化させるときにくっつけるsaltは何桁くらいにするのが一般的なんでしょうか。 教えてください。

  • PHPの可逆暗号化関数について

    こんにちは、現在PHP ver5とpostgreSQLでデータベースと連携させて使っているのですが、 テーブル内にデータを入れる際、今は平文のまま登録していますが、 この文字列を、暗号化してデータベースに登録し、取り出したい時に複合化して平文に戻せる関数はどういったものがあるでしょうか。 IDやパスワードといった文字列ではないので不可逆暗号化関数では元のデータベースの平文が分からなくなってしまうと思うのですが、 これを暗号化して登録しておき、抽出する際に元に戻す作業をしたいのです。 これってURLエンコード・デコードとは違いますよね・・・。 長くなりましてすみません。わかる方よろしくお願いします。

    • ベストアンサー
    • PHP
  • バキュームをクーロンから実行

    REDHAT7.3でPostgreSQL7.2を使用しております。 定期的にバキューム処理等を行う為に スーパユーザpostgresのクーロンにコマンドを登録しましたが pg_hba.confにてlocal接続はmd5で認証を掛けている為、 実行できませんでした。(パスワードを入れられない) セキュリティー上、認証をtrustにせずmd5のままクーロンから バキュームやアナライズなどの処理を実行したいと考えております。 どの様にしたらクーロンから実行できるようになりますでしょうか? 宜しくお願い致します。

  • 8文字以上の文字を暗号化する方法

    Apache1.3.37+PHP5.2.4+MySQL51.22のレンタルサーバでWEBコンテンツを作っています。 フォームから入力されたパスワードを、DBに格納する際、暗号化したいと思います。 MD5やsha1やcryptなどいろいろあるのですが、8文字を超える文字の暗号化ができないようです。 8文字を超える暗号化はどうすればいいのでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • php パスワード 暗号化

    phpの会員サイトにてパスワードの暗号化を実装したいと思い、投稿させていただきました。 会員の人はパスワード変更→暗号化でDBに登録。 変更したパスワード(暗号化されている)でログインという流れを作りたいのですが、 暗号化でDBに登録まではできましたが、ログイン認証で一致せず困っております。 どなたか教えていただけないでしょうか? 例: <input type="password"name="password" value="1234"> $pass = $_POST[pass]; $password = crypt($pass); $passwordをDBに保存。 その後ログアウトし、ログインのパスワードで1234を入力すると「一致しません」となります。 login認証の際にどのように実装してよいのかわからず困っています。 また、上記の内容にてセキュリティ上に問題がありましたらご指摘お願いします。

    • 締切済み
    • PHP
  • PostgreSQLのデータに半角カナが混入したので全角カナへの変換方法は?

    LinuxでPostgreSQLを使っています。 ある人が商品名を全て半角カナで登録してしまい、後で気づきましたのでそのコンバートをどうするか考えています。 DBでインサートする前に文字列が半角カナが含まれているかチェックする関数を作成しておけばよかったのですが後の祭りです。 Perlとかで変換できるのでしょうか?

専門家に質問してみよう