• ベストアンサー

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.1

(1) 無いです。1GBとかでもOK。 (2) 2-30文字くらいを乱数で生成すると良いでしょう

yusuke1980i
質問者

お礼

(1) パスワードで使うので全く問題ありませんね。 (2) 2文字から30文字ですか。了解です。 どうもありがとうございました。 乱数にすると認証時にどうやって照合するんでしょうかね・・・。 別枠で質問させてもらいます。よろしければ見てやってください。 http://okwave.jp/qa/q6379032.html

関連するQ&A

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

    パスワードのハッシュ化について | http://okwave.jp/qa/q6377700.html で質問したものです。 ユーザー登録するwebサイトを構築する予定です。パスワードはsaltをつけてsha256でハッシュ化して保存しようと思っています。 saltはランダムにしたほうが良いとの情報を得ましたが、ログイン認証をする際にそのsaltがわからなければならないと思います。ランダムなsaltはDBに保存してしまうんでしょうか?それとも他の項目(登録日時など)をキーにハッシュ化したものを使う、とかですかね? ランダムなsaltの管理方法を教えてください。 ※ asp.net(C#)とoracleで構築予定です。

  • パスワードのsaltの構築方法

    PHPでパスワードの登録でsaltを使用しようと考えているのですが、ネットで調べても自分の疑問に思っている事が出てきません。 パスワードにsaltという十分な長さ(40文字とか)の文字列を加え、それをmd5などでハッシュ化する・・・と言うことは分かりました。 しかしその実装方法が分かりません。 A.saltはランダム乱数でもいいし、セキュリティは低くなるが固定文字列でもいい。 B.saltは別ファイルに保管(一緒に保管と書いてあるのもありましたが)する。 、というような記事を見かけました。 で、自分はZendFrameworkのマニュアルに沿って考えたのですが、 データベーステーブルにpassword、saltカラムを作成する。 登録時、$_POST['ユーザの入力値']を(ハッシュ化する)passwordカラムに、saltはここでは単純にmt_rand(0,99)としてsaltカラムに登録、とした場合に認証時にはどのようにすればいいのでしょうか? 認証時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものと、データベースに格納されているパスワードと同じく格納されたsaltを結合しそれをmd5()したものを比べる ・・・となるとパスワードさえ合って入ればいいので別にsaltは不要なような気がするのでこの実装法は間違っているのかなと思います。 そうではなく、登録時にユーザの入力したパスワードとデータベースに格納したsaltを結合し、それをmd5()したものをpasswordカラム又はsaltカラムに格納する・・・というのも正しいのかな?と思います。 データベースに侵入されればどちらもダメなので、何か別ファイルに保管するのかなとも思いましたが良く分かりません。 登録フォーム => ログインフォームにおいてのsaltの実装法を教えていただけないでしょうか?少し頭がぐちゃぐちゃになり、ちょっと文章がおかしい気もしますがすみません。

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

  • 短いハッシュの作り方

    特に言語には関係がないのでこのカテゴリに。 md5やsha1でハッシュを作ると、32桁か40桁で大文字小文字の区別がないものとなります。 以下のような短いハッシュはどのように作るのでしょうか。 http://am6.jp/asRleJ http://twitpic.com/12zs0a http://bit.ly/axe7hu

  • ハッシュ化で元の文字列の方が長くても大丈夫ですか?

    例えば1000桁の文字列をphpのhash()でsha512を用いてハッシュ化した場合、重複の危険性は 無視出来る程度なのでしょうか。 ご存知のかた、お手数をおかけいたしますがご回答のほどよろしくお願い致します。

  • ハッシュ値のパスワードMYSQL検索で一致しない

    PHPでMYSQLにハッシュ値にしたパスワードを登録して、同じハッシュ値で検索を行いましたが、どうしても検索結果で一致しません。 パスワードの文字列をMD5を使ってハッシュ値に変換して次のようにMYSQLに登録しました。 $email = htmlspecialchars($_POST["email"]); $user_name = htmlspecialchars($_POST["user_name"]); $password = md5(htmlspecialchars($_POST["password"])); $sql = 'INSERT INTO user_tbl (email,user_name,password) VALUES ( "' . $email . '","' . $user_name . '","' . $password . '" )'; $sth = $dd->prepare($sql); $sth->execute( array() ); $qid = $dd->lastInsertId(); ※user_tblの定義のこんな感じにしてあります。 CREATE TABLE user_tbl ( email varchar(50) NOT NULL, user_name varchar(20) NOT NULL, password VARCHAR(50) NOT NULL ); 検索する処理でSQL等は次のように処理しましたが、検索結果がゼロ件でした。 $email = htmlspecialchars($_POST["email"]); $beforepass = md5(htmlspecialchars($_POST["beforepass"])); $afterpass = md5(htmlspecialchars($_POST["afterpass"])); $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"'; $q = $dd->prepare( $sql ); $q->execute(); if($q->fetchColumn() == 1){ //ここでパスワードが一致した場合の処理を書く } そこで次の2パターンのようにSQL文を少し変えてみたらそれぞれの検索結果が1件でした。 $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '"'; $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';                     ↓ $sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and user_name = "tanaka"'; (MYSQLのuser_tblのuser_nameには'tanaka'と入っている状態で実行したものです) SQLに渡される各変数には文字列が代入済みであることが確認できています。 MD5でハッシュ化した文字列同士を比較してどうして検索結果が一致しないのでしょうか? ちなみに検索したいパスワードのハッシュ値とDBに格納されているパスワードのハッシュ値を目で比較したら一致していました。 以上です。 ハッシュ値を検索条件に入れる場合に特殊な事をするのでしょうか? ヒントだけでもよいので教えて下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.1(API 16) PHP 5

    • ベストアンサー
    • PHP
  • SHA1ハッシュの生成結果が異なる理由とは

    Windows で Digest::SHA1 というモジュールを使って 文字列のSHA1ハッシュを生成するプログラムを作ったのですが、 $x = <STDIN>; と書き、100 と入力して生成したハッシュと、 あらかじめ $x = 100; のように設定しておいて生成したハッシュとでは、内容が異なっています。 前者は 310b86......、後者は 6a2903...... と出ます。 これはなぜでしょうか? 一致させるにはどうすれば良いのでしょうか。 ご教示ください。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • パスワードのハッシュ化

    ログイン機能を作っています。 password_hashしたパスワードをmysqlに保存しているのですがアカウントと照合しtrueを返すところで躓いています。 変数に引っ張て来た変数の中にパスワードがあるか検証したいのですがどのようにすればいいですか? var_dump($pass);//$passの中に上記の変数でハッシュ化された「samplepass」 で、 「$2...」 のような、文字列が出るはずが 「1」 になってしまいます。 不可逆ということは、出力も無理なのでしょうか?

    • ベストアンサー
    • PHP
  • パスワードの決め方について(SHA3orHMAC)

    パスワードの決め方や保管の方法について、分からなくなってきたので基本から質問させてください。 1.パスワードをホームページ等でネットに公開したら危険ですか? 2.1.はただそのまま公開したら危険なのでやってはいけないと思いますが、暗号化して、パスワードのパスワードがないと解けない状態にして公開しておけば安全ですか? 3.2.の暗号化の手法として、暗号学的ハッシュ関数を用いて、ハッシュ値 h をパスワードにすれば、暗号化したパスワードを公開しても安全ですか? 4.3.について、パスワードにしたハッシュ値 h を公開したのではパスワードをそのまま公開していることになり、危険なため、ハッシュ値 h を算出する暗号学的ハッシュ関数の実行コマンドをホームページ等で公開し、パスワードを確認したいときにはこのコマンドを実行してハッシュ値を得ることにすれば、安全ですか? 5.4.について、暗号学的ハッシュ関数はSHAシリーズなどがありますが、この実行コマンドは広く一般に利用できる状態で提供されているため(ハッシュ計算するソフトウェアやWebサイトなど)、SHAなど既存の暗号学的ハッシュ関数を用いるのではなく、自分で専用に暗号学的ハッシュ関数を考案し、また実行コマンドやソフトウェアを作成する必要がありますか? 6.5.が大変な場合、SHAなど既存の暗号学的ハッシュ関数を用いて4.を実現するにはどうしたらいいですか? 7.4.について、コマンドがパスワードの数だけ存在すると管理が大変です。コマンドは共通にして、オプションスイッチで区別することはできませんか? 8.7.について、コマンドは既存のソフトウェアをあらかじめインストールしておき、オプションスイッチを含む実行コマンド文のみをHP等で公開しておくことはできませんか? 9.6.7.8を実現するには、オプションスイッチのうちのひとつをパスワードのパスワードとして、このスイッチのみを非公開とすれば良いですか? 10.9.について、コマンド文はどのように記述すれば良いですか?たとえばハッシュ関数H()、出力h、パスワードの対となる文字列(IDとかファイル名等)m、パスワードのパスワードをk、||は結合とした場合、 H(k||m)=h と書けると思いますがこれをH(m)として公開し、kはあらかじめPC等コマンドを実行する環境で設定しておけば良いですか? 11.10について、暗号学的ハッシュ関数SHA2シリーズ(256bit等)を用いた場合、Merkle-Damgård 構造であるため、length-extension 攻撃され、危険ですか? 12.10.11.について、暗号学的ハッシュ関数SHA3シリーズを用いた場合、SHA2シリーズのハッシュ関数と異なりスポンジ構造であるため、length-extension 攻撃は成り立たず、安全ですか? 13.12について、length-extension 攻撃以外の危険性はありますか?

  • パスワードの最良な決め方について(長文)

    パスワードを最大限に複雑に決めたいとします。 当然、覚えられないので、適当な言葉で決めて、seedを付けてハッシュ関数へ入力し、出力をそのままパスワードとして使うとします。 (ハッシュ関数の出力は16進数ですが、文字数を少なくしたいので、使える文字を全て使用して、文字へ割り当てます。) seedは秘匿し、適当な言葉にあたる部分はブログ等に公開でもいいからメモっておくとします。 例えば、この質問サイト(OKWaveからログインしてます)であれば、 OKWavePassword_change#_0 といったような言葉を決めて、SNSのプロフに載っけておくとかです。 実際に使う際には、頭に(どこでもいいのですが)seedを付けて、 myseedOKWavePassword_change#_0 のようにして、ハッシュ値を取り、文字割り当てしてクリップボードへコピーして パスワード欄に貼り付けるかんじです。 ここからが質問です。 【質問1.ハッシュ関数はどれを使えば良いでしょうか?】 SHA-2シリーズはlength-extension攻撃に弱いので、HMACの形式にして使わなければならず、またその場合、Windowsのコマンドプロンプトで使える手軽な実装が見つからないのもあって(コマンドプロンプトにこだわる訳は要望があれば補足で説明したいと思います)、使用は避けたいです。 そこで、SHA-3シリーズが策定されてるようなので、この中で最大のビット数のものを選べば良いと思っていたのですが、Wikipediaを見たら、SHAKE128、同256というのがあり、読んでみると、 出力長を、任意に設定できる そうですが、だとすると、SHA-3の最大ビット数(SHA-3 512)と比べて、上述の使い方で考えると、どちらが良いでしょうか? もしくは、他により良いハッシュ関数がありますか? というのは、SHA-3 512では(というか、SHAKE以外のSHA-3では)出力長は固定なので、必要であれば(ほぼ全てのケースだと思いますが) そのパスワードで使用できる最大文字数にしなければならず、 その方法としては、文字割り当てまで終わってから、ただ単に頭から文字数分取るとか、間の文字を抜いて詰めるくらいしか思いつかないので、 それでどの程度、一様性が下がって(偏りが生じて)、危険になるかは、良く分からないのですが、 それであれば、512ビットより落ちる256ビットであるとしても、SHAKEであれば、ハッシュ値が得られた時点で過不足の少ない(0にはならないみたいですが、実装のせい?)情報量に収まっているので扱いやすいこともあり、いいかなと思っているのですが、どうでしょうか? 要するに、512ビット固定長のハッシュ値を文字割り当てしてから(16進表現の時点では難しそうなので)、頭から一定の大きさまで削った場合と、 SHAKE256で最初から過不足の少ないハッシュ値を得て文字割り当てした場合とで、どちらがよりマシかということになると思いますが…… 例えば、例としてGmailのパスワードで考えると、確か、ASCII印字文字95種フルフルで使えて最長64文字だったと思いますが、 この場合だと512ビット固定長のがマシになりそうですが…… (512ビットを95進数表現すると78文字(桁)だから、78文字の先頭から文字を取るなり、間を詰めるなりして64文字にするほうが、256ビット分(95進数で39桁)を無理に引き伸ばすより安全そうというのが理由) ↑のようなパスワードを使うことが多ければ、というか多くなくても今後10年くらいは変えたくないので(SHA-1やSHA-2の寿命から;2はまだ死んでませんが)後々の事を考えればSHA-3 512で統一しておいたほうが結局無難でしょうか。 或いは、どっちもダメということもあるのでしょうか…… そもそも、ハッシュ関数を使うという考え方自体がダメだったりするのでしょうか…… 【質問2.仮にSHAKE256を使うとすると、出力長はどうやって求めれば良いでしょうか?】 例えば、OKWaveでは、パスワードの文字条件が、 使える文字がa~z, A~Z, 0~9, -, _で、文字数が最大10文字だそうですが、 この場合、パスワードの総パターン数を16進数で表した文字数にすればいいのでしょうか。 具体的には、総パターン数は64の10乗通りで1152921504606846976個、 16進数にすると1000000000000000で16文字で合ってますか? また、多くの実装では、出力値が0起算のため、例えば今の例だと実際に取り得る値は 0~((64の10乗)-1) の範囲になるかと思いますが、つまり、 000000000000000~FFFFFFFFFFFFFFF が実際に出てくる値の最小~最大となるため、15文字で設定すれば良いということでしょうか? 【質問3.具体的な例で確認したいのですが?】 SHAKE256で15文字として、seedはなしとすると、 OKWavePassword_change#_0 のハッシュ値は 911C7E7009C307 と出ましたが合ってますか。(HashSum使用←バイト単位でしか設定できないので、8byteだと文字割り当て後、11文字になるパターンが有り得るので7バイトで設定(1byteは16進数2文字)) またこれを64進数に変換すると、 02 17 07 07 57 48 02 28 12 07 になると思いますが合ってますか。 またこれを文字割り当て(ASCII文字コード表の通りの順番で、使用できる文字だけ拾って割り当て)すると、 1G66tk1RB6 となりましたが、合っているでしょうか。一応10文字にはなりましたが。 あと、HashSumがバイト単位の設定なので7バイトにしましたがこれだと9文字になるパターンも有り得ますよね。 その場合は10文字になるまで、入力値のOKWavePassword_change#_0の最後の0を1とか2とかに変えていけばいいかと思ってますが。 まぁそれ用に項目を置いてOKWavePassword_dummy#0_change#_0とかにしてこの場合dummy#の直後の数字を変えるという決めにするとかしとけば、パスワードを今まで何回変更したか知りたい(そんな要望あるのかはともかく)ときにゴッチャにならないで済むけど。 みたいな細かい問題は出てくると思いますが、このように柔軟に対応できると思っていますが、何か他に対応の難しい問題はありそうですか? 【質問4.全体的にどうでしょうか?】 みたいな。 なんか結局、今まで考えていた通りにSHA-3 512でやっとけば良さそうな気がしてきましたが、全体通して総評ください。 以上、よろしくご回答の程、お願いいたします。

専門家に質問してみよう