• 締切済み

パスワードをハッシュにしてDBに収納って無意味では

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

noname#235729
noname#235729

みんなの回答

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

被害の拡大を防ぐために、取れる対策は出来るだけやっておきましょうということです。対策は何重にも行った方がより強固になります。 分かりやすく言えば、銀行が「通帳と印鑑は別々に保管しましょう」と呼びかけているのを、「泥棒に入られることが前提なら、別々に保存しても同じなのでは」という問いと同じでしょう。 もちろん、そもそも侵入できないように対策するのが一番ですし、そのための対策も行うべきでしょう。しかし万が一入られたときでも、印鑑が見つからなければ被害の拡大を小さく抑えることができるわけです。 システムに関して言えば、現実に発生していたのはSQLインジェクションによる情報の取得です。最近はあまり聞きませんが。UPDATEやINSERTも出来てしまうケースもあれば、SELECTしか出来ないケースもあります。そしてSQLインジェクションによってパスワードを含む情報を取得されたときに、その後アカウントののっとりができるようになります。 例えばオンラインゲームだったら、レアアイテムや仮想コインを別のアカウントに移したりできます。証券口座やFXの口座などなら任意の銀行口座を指定し出金することも出来ます。この場合、正常に見える処理が行われているので、顧客からクレームがあっても原因の特定が困難で対応が遅れます。 しかしパスワードをハッシュ化しておけば、アカウントののっとりは出来ず、せいぜい個人情報の漏えい程度で済みます。 上記では実際に発生したケースがあったのでSQLインジェクションを挙げましたが、システム開発会社のSEが持ち出すかもしれませんし、サーバーリプレイス時に処分したHDDから情報を盗み取られるかもしれません。サービスを提供する会社は、定期的にパスワードを変更するようお知らせをしたりしますが、ユーザーは無視して使い続けることが多いでしょう。ですので、多少古いメディアから抽出した情報でも、現在稼動しているシステムで使用できるパスワードが含まれている可能性は十分にあります。 これについても、情報の持ち出し、破棄HDDからの盗み取りが出来ないよう対策を執るべきですが、万が一もれたときに被害の拡大を防ぐことが出来ます。 あともう一つ重要な点もあります。「取れる対策は出来るだけやっておく」事自体にも重要な意味があります。 「ユーザ情報が漏洩し個人情報が販売されました。その上パスワードをハッシュ化していなかったためにアカウントののっとりが発生し被害が拡大しました」と報道されるのと、「ユーザ情報が漏洩し個人情報が販売されました。しかし、パスワードをハッシュ化していたために被害の拡大を抑えられました」と報道されるのでは、どちらが社会的な信用の低下度合いが大きいでしょうか。 対策を何一つとしてやろうとしていなかった会社と、やろうという姿勢はあったが不十分であった会社。この印象の差は大きいと思います。

noname#235729
質問者

お礼

 お礼が大変遅れて申し訳ございません。  確かに情報を手に入れても使えなくては意味が無く、パスワードのハッシュ化で乗っ取りまではできないようにしておけば、その間に対策を取る時間は作れますよね。  やはり、個人でやってるサイトと、企業などのサイトでは、考え方が違います。  ご回答ありがとうございました。

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

例えば、銀行のデータベースの中身が流出したとして、口座番号、氏名、残高などの情報が漏れますね。でもばれるだけ。もちろんそれはそれで困りますが。 ログインID、パスワードまで漏れて、漏れたことがわからないと、ログインして送金など出来てしまいます。 中身流出だけじゃなくて、更新し放題の情況になるように侵入された場合は、確かに意味無しです。 あと、パスワード以外は、仮に暗号化しても復号可能なような暗号化しかできません。中身がわからないと使えないので。 パスワードだとハッシュ、つまり、復号不可能な暗号化が可能なのでしていると言うこともあります。

noname#235729
質問者

お礼

 お礼が大変遅れて申し訳ございません。  乗っ取られたときより、漏れたときのことを考えれば確かに必要ですね。  ご回答ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.2

>おそらくデータベースがハッキングされるなどして覗かれた時にパスワードを漏らさないためだと思うんですが、そもそもデータベースがハッキングされてる時点で終わってますよね? ですね。「外部からの攻撃でデータを抜かれる」ってのは「それ以前の問題」ですからね。 なので、パスワード等を「読めなくする意味」は、内部の犯行でデータが漏洩した場合の被害を最小にする為と、内部の人間が顧客に成り済まして顧客のIDとパスでログインしたりと言う事が出来ないようにする為です。 「社内の人間が全員すべて善人」とは限りません。 リストラの腹いせに、辞める直前にデータベースをコピーして持ち出して、名簿業者に売ろうとする者が居ないとも限りません。

noname#235729
質問者

お礼

 お礼が大変遅れて申し訳ございません。  なるほど。  趣味でプログラミングをやっていただけなので気づきませんでしたが、内部の人間がってこともありえますよね。  確かにそれを考えると、ハッシュ化は無意味どころか必須と言えます。  ご回答ありがとうございました。

  • t_ohta
  • ベストアンサー率38% (5076/13258)
回答No.1

そのログインIDとパスワードが他のサービスでも使いまわされていた場合、二次被害を生む可能性があります。 情報漏洩の多くは内部犯によるものです。 顧客のパスワードを盗み出して、他のサービスにログインして悪さをするような事が出来ないよう対策するには、顧客が設定したパスワードを分らなくしてしまうのが一番です。

noname#235729
質問者

お礼

 ご回答ありがとうございます。  なるほど。  ハッキングされたデータベースはもう捨てるとしても、顧客が別のサイトなどでパスワードを使いまわしていたことを考えて、ハッシュ化しておくわけですか。  それなら充分、意味があります。  Webサービスを扱うには、自分のことだけを考えていてはダメということですね。

関連するQ&A

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

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

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

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

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

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

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

  • データベースに登録してあるパスワードを画面に表示

    データベース(MYSQL)に登録してあるパスワードを暗号化(ハッシュ化)して保存してあります。 それをPHPに表示させる際どのようにもとのパスワードに戻して表示させるかがわかりません。 もとのパスワード abcd とする。 ハッシュ化したものを仮に123456789とする。 データベース上では123456789となっているが PHP上ではabcdとパスワードを表示させる方法がわかりません。 やりたいのは、 PHPのシステムにログインしている状態で別のシステムにリンクで飛んだ際、 「ユーザ」「パスワード(abcd)」で自動ログインさせたいのです。 ※ユーザは暗号化していないので「ユーザ」データを引き継いでいく事ができるのですが パスワードが暗号化されている為、どのように表示させたら良いのかが分からないのです。 <a target="_blank" href="http://192.***.**.****/●●●/portal/?action=ALJLoginUser&username=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['username']); ?>&password=<?php echo htmlspecialchars($_SESSION['GO_SESSION']['password']); ?>" > 上記ですと]['username']は表示できますが['password']は空になってしまいます。 どのようにしたら良いのでしょうか? どうぞ宜しくお願い致します。

  • パスワード暗号化

    パスワードを暗号化するにはphp関数などでハッシュ化させてからINSERTするしかないのでしょうか? MYSQL自体に現在INSERTされている文字列をハッシュ化させる方法はないでしょうか?

    • ベストアンサー
    • MySQL
  • ハッシュ関数について質問です。

    プログラミング・数学? 初心者です。 IDやパスワード管理によく出てくる一次方向(ハッシュ)関数ですが、 よくパスワードとSALTを一緒にしてハッシュ関数を通してハッシュ値を取得しますよね。 そしてその結果(データベースなどに記録済み)とログイン時に入力した値とを照らし合わせるわけですが、 昔まだ若いころ、これとは別のタイプのハッシュ関数を使用したことがあります。 それはある(パスワードなどの)値をハッシュ関数で処理すると「いろんなハッシュ値」が生成され、 そのハッシュ値から当然パスワードは予測できないのですが、 しかしその複数のハッシュ値は全て、そのパスワードから生成されたハッシュ値だということは分かる、という関数を使用したことがあります。 その時はperlのcpanモジュール(名前を覚えていません。すいません。)を使ったのですが、この別のタイプのハッシュ関数はどういう仕組みで作られているのでしょうか? SALTが複数あり、そのそれぞれについて照合している?だけでしょうか? それとも私が無知で、そんな関数がそもそも存在するだけでしょうか? わかりません。教えてください。

  • MySQLでパスワードをrequireする意味

    MySQLでデータベースを作成して、データベース認証させてコンテンツを表示するプログラムを書いているのですが、パスワードやユーザー名をルートディレクトリの外に置いてrequire_onceする意味が今ひとつわからないので教えて下さい。 require_once('../../../DBparameter.php'); // DBparameter.phpの中にパスワードやユーザー名 として、ルートディレクトリの外にDBparameter.phpを置けば確かに、パスワードやユーザー名を見ることはできませんが、このプログラムが存在するフォルダ内をのぞけるぐらいの詳しい人であれば、このプログラムを見るのは簡単にできると思うんですが、そうすると、 $con = mysql_connect(host, username, password); などとしてデータベースを開き、結局はデータベース内の情報を抜かれてしまうような気がするのですが、どうなんでしょうか? 確かに、データを抜き取るためのプログラムを他人のドメインにアップロードするのは簡単ではないので、ほとんど無理だとは思うんですが、それならばスクリプト内にパスワードやユーザー名をそのまま書いてもいいのではないかという気がするんです。

    • ベストアンサー
    • MySQL
  • パスワードハッシュ化時の乱数のsaltについて

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

  • mysql_select_dbでエラーが出ます

    phpのmysql_select_db()でデータベースを選択すると Access denied for user ''@'localhost' to database 'データベース名' とエラーが出ます。 元もとあるtestというデータベースは選択できましたが、 phpmyadminで新たに作成したデータベースだとエラーになります。 エラーの意味と対応方法をご教授下さい。 よろしくお願いします。 環境 さくらインターネットのVPS CentOS php5.1.6 mysql5.0.77 phpMyAdmin2.11.11.1 mysql_connect()ではrootでログイン

    • ベストアンサー
    • MySQL

専門家に質問してみよう