ユーザーパスワードのDBの格納について

このQ&Aのポイント
  • ユーザーパスワードのDBの格納方法について検討しています。
  • 現在、ユーザーパスワードが平文のままDBに格納されているため、セキュリティリスクがあると考えています。
  • ハッシュ+ソルト+ストレッチングを用いることで、パスワードを安全に格納し、認証時にも使用することが可能です。
回答を見る
  • ベストアンサー

ユーザーパスワードのDBの格納について

あるメーカーのソフトウェアを使用しており、Webからログインするときのユーザ名、パスワードがユーザーデータベースのテーブルに平文で格納されています。 そのソフトで使用しているデータベースはSQL Server 2008R2になります。 平文で格納されているのが気になっており、SQL Server 2008R2を使用してテーブルに格納するパスワードをハッシュ+ソルト+ストレッチングして格納すること仕組みとして可能かどうか気になっております。 もし仕組みとして可能な場合、Webからログインした際にユーザーが入力したパスワードをハッシュ+ソルト+ストレッチングして、テーブルに格納されているハッシュ+ソルト+ストレッチングしたパスワードと比較して認証を行うようにプログラミングは可能でしょうか。

noname#242248
noname#242248

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

  • ベストアンサー
回答No.1

DBに平文でパスワードを保存する というのは、御法度ですね。 なんらかの理由でDBのデータが漏洩してしまったら、 自社のサービスへの不正アクセスが可能になるだけでなく、 同じパスワードを使いまわしているユーザーにとっては よその不正アクセスも可能になります。 よく、Webのログイン画面に 「パスワードを忘れたらこちら」みたいなボタンがありますが、 それで、パスワード再設定のURLがメールで送られてくるのではなく、 実際の生パスワードが送られてきたら、そのWebサービスは 信用してはいけません。 (パスワードを平文で保存しているとういことですから) > (暗号化したパスワードでDBに保存しておいて、ログイン時に入力した) > パスワードと比較して認証を行うようにプログラミングは可能でしょうか。 はい。もちろん。 これは、SQLサーバーの機能は関係なく、 どちらかというと 認証用のプログラムのロジックに係ることです。 PHPの例ですが、  http://php.net/manual/ja/faq.passwords.php が参考になると思います。 つまり、パスワードを保存するときは、 暗号化(ハッシュ+ソルト+ストレッチング)しておいて、 ログイン時の確認は、 ログイン画面に入力された生パスワードと、そのユーザーID用のソルト(大抵は保存された暗号化パスワードそのものでも大丈夫)を  暗号化関数にいれて戻ってきた値が、保存されていた暗号化パスワードと文字列が一致するかで パスワードチェックをすればよいことになります。

noname#242248
質問者

お礼

ありがとうございます。 SQLにはMySQL,PosgresSQL,Oracle,Sybaseなどがあり、メーカーが異なるだけでどのDBMSでも暗号化されたパスワードでも保存できると思っていましたが、SQL Serverは何か特別な理由があって暗号化されたパスワードが保存できないのかなと思っていました。 そうは思いましたが、暗号化されていようが平文だろうがDBMSはデータを格納するだけで、認証の仕組みはプログラム設計の問題になるのではという考えもあったため、質問をさせて頂きました。

関連するQ&A

  • パスワード生成

    パスワードとソルト(乱数)を組み合わせてハッシュ化し、それをdbに保存するのですよね? ソルトはユーザー毎に違うものにしたいらしいのですが、ソルトの特定はどのようにすればよいのでしょうか? 次回ログインする際、パスワードはユーザーに打ってもらえますがユーザーのソルトまで特定するにはどこかに保存する必要があるのではないでしょうか?

    • ベストアンサー
    • PHP
  • パスワードをハッシュにしてDBに収納って無意味では

     PHPとMySQLを勉強中のものです。  教科書本の中でサイトへのログインパスワードなどは、ハッシュにするなどしてデータベースに入れた方が安全だとありました。  ハッシュにするというのは今では当たり前のようですが、これって意味あるのかな?という疑問もあります。  おそらくデータベースがハッキングされるなどして覗かれた時にパスワードを漏らさないためだと思うんですが、そもそもデータベースがハッキングされてる時点で終わってますよね?  サイトへのログインなんてしなくても、直接データベースを触れる状態なんだから、ログインパスワードなんて必要ないと思うんですが…。  データベースそのもののパスワードをハッシュ化してどこかに収納するというなら分かるんですが、データの一部でしかないログインパスワードをハッシュ化して意味あるんでしょうか?

  • PHP PEAR AUTH 認証でのパスワードを忘れた場合

    AUTHを利用しての、認証を行う場合、usernameとpasswordの カラムを持つテーブルを参照しますが、このpasswordは MD5でハッシュした値で、テーブルに格納しなければならないようです。 この場合、パスワードを忘れてしまった際など、テーブルを 見てすぐにpasswordの値が確認できないので不便です。 なのでテーブルに格納するパスワードは平文としたいと思います。 平文でpasswordを格納しても、'cryptType'=>"none"とすれば 認証は通りますが、やはり平文では心配な所があります。 良い解決方法があれば教えてください。

    • ベストアンサー
    • PHP
  • phpのパスワードのハッシュ化について

    phpで会員サイトの作成を学習しています。 PDOを使用してMysqlサーバーに接続しています。 開発環境はxamppでphp Version 5.5.15を使用しています。 入力フォームにユーザーの情報を入力してもらい、 データベースに格納する際、 基本的なセキュリティ要件として パスワードをハッシュ化する必要があるということを こちらのサイトで(http://php.net/manual/ja/faq.passwords.php) 知りました。 ハッシュ化については初耳で、いまいちハッシュアルゴリズムの種類による違い等はまだ理解しきれていないのですが、 PHP5.5.15を使用しているので、パスワードのハッシュアルゴリズムは 上記サイトに載っているようにpassword_hashを使用するのが今のところ最善なのでしょうか? また、ハッシュ化されたパスワードの認証についてですが、 ログイン画面でパスワードを認証する際、 ユーザーが入力したパスワードをハッシュ化して 該当レコードのハッシュ化されて保存されたパスワードと 同じであれば認証が成功するという認識で正しいでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • パスワードの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
  • データベースのログインユーザー名とパスワードが分からない状態でSQLイ

    データベースのログインユーザー名とパスワードが分からない状態でSQLインジェクション攻撃は可能でしょうか サーバーの構成は以下の通りです ウィンドウズ2008サーバーR2のIIS7.0+SQLサーバ2008EXPRESS 以前win2000サーバーでウェブサイトを運営中コンテンツをごっそり抜かれてしまったことがあるので, 攻撃者はソース上からテーブル構造の知っていると考えられます。 現在テーブルに対してinsert処理もしくはUPDATE処理しているファイルは中国方面あるいはアジア圏のIPアドレスからは アクセスできないようにしており、403エラーが出るように設定していますので、ファイルに対してポストできないように なっているはずです。 この状態でテーブルへのスクリプトの書き込みは可能なのでしょうか 現在この状態でもスクリプトが書き込まれてしまいます。 仕方ないので、データベースのすべてのログインユーザーに対して書き込み・上書き権限を除外しました。 こうしたところ書き込みはなくなりました こうしてしまうと、商品情報などを登録するたびに、ユーザーに対して書き込み・上書き権限を与える必要があり、非常に生産性が悪い状態になってしまっています。

  • ユーザー名とパスワードについて

    宜しくお願い致します。 WindowsXP Professional を使用しております。 LAN上にあるサーバーにログインする為に、 ユーザー名とパスワードが必要なのですが、 数ヶ月前に一度ログインした後は何もせずに ログインできるようになってしまい しばらく何も考えずに使用しているうちに ユーザー名とパスワードを忘れてしまいました。 今週中に他のパソコンに変えたいのですが、 ユーザー名とパスワードを思い出せません。 現在ログインできているWindowsXP Professional が記憶しているサーバーへのログインの為の ユーザー名とパスワードを知るには どのようにすれば良いでしょうか。 どうぞ宜しくお願い致します。

  • transact-sqlからoracle DBを参照したい。

    transact-sqlからoracle DBを参照したい。 sql-server 2005 window server 2003 R2での環境です。transact-sqlを使用して、他のマシン上にあるoracle データベース上のテーブルのデータを取得し、そのデータを自身のマシン上のsql serverのテーブルに格納したいのですが、そのようなことはできますでしょうか。 もし、できるとすれば、どのような方法(手順)になるのでしょうか。

  • Yahoo! ユーザ・パスワード流出について

    ユーザ ID だけではなく、1 百万超ユーザのパスワードが漏れていたらしいことを発表しましたが、 これはパスワードのいわゆるハッシュ・リストなのでしょうか。それ以上のことが書かれていないので、何ともわかりません。 それとも、平文のリストでも存在して、それが流出したのでしょうか。 前者の場合は辞書攻撃や総当たりの「事務的」手続きが簡略化されるだけで、さして問題とならないような気がしますが、万一後者なら、なぜそんなリストが存在するのでしょうか。 スーパユーザが一般ユーザのパスワードを知る必要なんてどこにも存在しない(SU は何でもできるので)と思いますが、管理者がそんなものを保存する意義は何かあるのでしょうか。

  • パスワードをかける

    初めまして。初心者です。 社員番号、パスワードを入力し、個人のページに飛ぶような仕組みを作りたい のですが、 かなり苦労しています。 Requestの社員番号と、データベースの社員番号を比較し、 間違っていれば、エラーが出るようにし、 あっていれば、次のページに進むようにしたいのです。 見よう見まねで、↓のように作ってみたのですが・・・ これでは全然ダメだという事は分かるのですが、 どうしたらいいのか分かりません。 どうかお教えください。 データベース名:career_web テーブル:pass (社員番号とパスワードのテーブル) テーブル:plan (社員番号と、個人ページに載せたい情報(所属部署等) のテーブル) <% Set cn = Server.CreateObject("ADODB.Connection") cn.Open "career_web" sql = "SELECT *" sql = sql & " FROM pass" sql = sql & " WHERE (社員番号 = '" & Request("社員番号"))" On Error Resume Next Set rs1 = cn.Execute(sql) If (rs1("パスワード") <> (rs1(" & Request("パスワード")) Then Response.Write "<tr><td><font size='2'>正しいパスワードを入力し てください</font></td></tr>"   Else End If rs1.Close %> データベースの社員番号と、Requestの社員番号が 一致しない場合に、 ”正しいパスワードを入力してください” と出し、 一致した場合は blankのページに飛ぶような設定にしたいのですが、 ルールの定義の仕方がまったく分からないのです。