より安全にパスワードを保存するために考えること

公開日: : 最終更新日:2014/01/26 プログラム ,

知ってる人にとっては当たり前のことだろうが、あまり深く考えたことがなかったので調べてみた。

前提

パスワードは平文で保存しちゃダメ。クレジットカード番号などの情報にもダメ。

加工手段に暗号化を採用してはならない

一般的な加工手段は暗号化ではなくハッシュが用いられている。暗号化が不採用な理由は、システムの root 権限が取られた場合に復号化されてしまうから。

そのため、ハッシュ関数の中でも暗号的な特性を満たす「暗号学的ハッシュ関数」を使って得られたハッシュをデータベースに保存する。暗号学的ハッシュ関数の特性の1つに、原像計算困難性、あるいは、一方向性というものがある(ハッシュ値から元の文字列を求めることが困難という性質)。この性質をパスワードの保存に利用している。

ハッシュを用いた認証方法

ハッシュから元の文字列を求めることは困難であるため、入力されたパスワードからハッシュを計算し、その結果とデータベースに保存してある値を比較する。一致すればパスワードも一致していると解釈する。

しかし、ハッシュだから安全だとは限らない

ハッシュからは元の文字列を求めることは困難であるが、時間をかければ求めることができるため絶対に安全だとは言えない。例えば、以下のような攻撃でパスワードを解析されてしまう。

  • オフライン辞書攻撃
  • オフライン総当たり攻撃
  • レインボーテーブルによる探索

ハッシュ関数に MD5 を採用するのは控えたほうがいいが、より安全な SHA-256, SHA-512 を採用したとしても時間をかければ解析されてしまうというのが現実のようだ。

アプリケーション側が取るべき対策その1:ソルト

とは言え、パスワードはハッシュして保存することには変わらない。それにプラスして、どのような対策を取るか、という話。

ソルトは必ず採用する。

ソルト化ハッシュ = hash(パスワード + ソルト)

ソルトによる効果は以下の通り。

  • 同じパスワードを付けていてもハッシュ値が異なる
  • ハッシュ値の元となる文字列を長くすることにより、レインボーテーブル探索を妨害する

また、これらの効果を得るために、ソルトには以下の要件が必要となる。

  • ユーザーごとに異なるソルトを使う
  • ある程度の長さ(20文字程度以上)を確保する

ソルトは乱数でなくてもよい。通常、ソルトはハッシュ値とともに保存するので秘密情報ではないから。また、ある程度長さが確保できれば、ユーザ ID そのものをソルトにすることもできる(ユーザ ID を後から変更できるサイトの場合は実装に工夫が必要)。

ソルトは「レインボーテーブルによる探索」に対して効果を発揮する対策である。

アプリケーション側が取るべき対策その2:ストレッチング

一般にハッシュ関数は高速性を求められるが、この高速性は総当たり攻撃に対しては脆弱な方向に働いてしまう(総当たりに要する時間も短縮されるため)。ハッシュ保存用にわざわざ低速なアルゴリズムを開発するのも手間が掛かるので、高速なハッシュを繰り返し用いることで速度を遅くするというのが、ストレッチングの考え方になる。

ストレッチングの回数は多いほど安全になるが、サーバ負荷が増えるというデメリットもある。あまりに負荷が高くなると、認証のページを同時にアクセスすることで DoS 攻撃に悪用されるリスクも生じてしまう。

仮にストレッチングを1万回とすると、「8文字英数字のパスワード」のハッシュ値をすべて求めるのには30万時間、約34年かかることになる。数字だけ見ると十分なようにも見えるが、GPU の処理速度の向上や並列処理による時間短縮を考慮すると、決して十分安全ともいえないのが実情である。

ストレッチングは総当たり攻撃に対して効果を発揮する対策である。

現状のベストプラクティスは「ソルト+ハッシュ+ストレッチング」

あくまで現状。将来にわたって安心というわけではない。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-sublimetext_9222613858_mini-thumbnail

Sublime Text3 のインストール直後に行った設定メモ

突発的に自宅のマシンにインストールしてあった Sublime Text2 を 3 にアップデートしま

記事を読む

icatch-8785445626_587fdac14d_z-resized

検証用の CentOS をインストールした直後に行う初期設定手順

職場でも自宅でも Linux で検証したい作業があったので VMware に 64 ビット版の Ce

記事を読む

icatch-2015-004-1

Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に Octopress をインス

記事を読む

icatch-thumbup_3507728739_mini-thumbnail

Sublime Text3 に SublimeLinter-jshint をインストールしてみた

エディタに Eclipse を使って Java のプログラムを書くことが多いんですが、JavaScr

記事を読む

icatch_8617990318-resized

yum が参照するミラーサイトの baseurl を変更して日本国内のものに設定する

yum が参照するリポジトリのミラーサイトは変更することができます。 このミラーサイトを日本国内のも

記事を読む

icatch-2015-003-1

Vagrantで起動したCentOS上のMySQLにホストOSからログインする設定

マシンを新しくしたこともあり、検証と称してソフトウェアをやみくもにインストールすることに抵抗が出てき

記事を読む

icatch_5428744075-resized

scp を使ってファイルのコピーを実行したら “command not found” と表示されたときの対処法

CentOS が起動しているサーバに scp を使ってファイルをコピーしようとコマンドを実行したら

記事を読む

no image

CVS でタグ間で変更があったファイルを抽出するスクリプト

今どきバージョン管理ツールに CVS を使っているところは珍しいと思うし、あまり需要はないだろうけど

記事を読む

20140811-00

64ビット版のCentOSをVMwareにインストールできない場合の対処法

Linux で検証したい作業が多かったので VMware に検証環境を作りました。OS は Cent

記事を読む

icatch-medium_4301351732-resized

mp3splt を実行して “undefined symbol: mp3splt_u_check_if_directory” と出力されたときの対処法

mp3 ファイルを分割してくれる mp3splt というライブラリがあります。 mp3 ファイルを

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


× 7 = 四十 二

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑