やられアプリ BadTodo - 17.3 パスワードハッシュ化の目的

前回:やられアプリ BadTodo - 17.2 補足 保存するパスワードのハッシュ化 - demandosigno

今回の内容は記事の最後にリンクを貼った徳丸さんの解説動画の内容などから自分なりにまとめたものです。(細かい点はわざと省いています。徳丸さんの動画はとても分かりやすいですのでぜひ全編視聴してみてください)
これらを踏まえた上で、次回のハッシュ値の解析に進みます。

データベースに保存されるデータは盗まれた際の保険として暗号化されます。

データベース暗号化の目的

  • 重要情報を保護したい
  • 情報が漏洩しても悪用されないようにデータを暗号化する

つまり情報漏洩に対する緩和策です。
(暗号化 AES:共通鍵, RSA:公開鍵。AES-256:Amazon RDS, S3, IAM など)

一方、前回 password_hash 関数を使ったように、パスワードハッシュ値で保存されることが多いです。(ハッシュ関数 MD5, SHA-1, Bcrypt など)

どうしてパスワードの保護は「暗号化」ではなく「ハッシュ」なのか

  • 暗号だということは復号できる
  • 復号には鍵が必要だが、その鍵の管理が難しい(サーバーに侵入されているような状況では鍵も盗まれる⇒一例
  • データをアプリケーションで使う場合にも鍵を使わなければ暗号化・複合ができないが、攻撃者には鍵を見せたくない(侵入した攻撃者はアプリケーションと同じ権限を持つため区別が難しい)
  • 利用者側からすればパスワードをサイト管理者にも知られたくない(管理者は鍵を使って平文に戻せる)
  • ハッシュだと鍵を使わないので鍵管理のわずらわしさがない

ハッシュで保存されたパスワードは本当に安全か

ハッシュの特徴:一般的に(暗号学的)ハッシュ値から平文を「復元する」ことはできない。
「password」のMD5ハッシュ:5f4dcc3b5aa765d61d8327deb882cf99

  • 任意の長さの入力を固定長の出力に変換する
  • 不可逆性(原像計算困難性)
  • 衝突困難性:同じハッシュ値となる二つの異なる元データを見つけにくい(同じハッシュ値となる元データが発見されると、ハッシュ値を用いても元のデータが改ざんされたものなのか判断できなくなる)

しかし、パスワードの場合は特別な事情がある。

  • 4桁数字の暗証番号をハッシュ値で保存⇒計1万通りしかないので総当たりで確認すればOK(8桁でも同じ。1千万通り)
  • 単純なハッシュ計算だと同じパスワード=同じハッシュ値となる。一つ解読されると複数バレる

これに対応するために、ソルト(Salt)の付加やストレッチング(Stretching)が行われる。
ソルト:ハッシュの元データ(パスワード)に追加する文字列。ユーザ毎にソルトを変えることで、パスワードが同じでも異なるハッシュ値が得られる。
ストレッチング:ハッシュの計算を繰り返すこと。1万回ストレッチすると「モンスターマシンで20分」が20万分(139日)になる計算。

ペッパー:パスワードに「固定の秘密文字=ペッパー」を追加してからハッシュを求める
パスワード漏洩=ハッシュ値とソルトも漏洩。ソルトとストレッチングは「弱いパスワード」までは保護できない(単純な文字列は辞書攻撃の方で破られるため)

パスワード$ペッパー$ソルト
ソルトはハッシュ値とともにDBに保存。ペッパー(シークレットソルトとも。固定)はDB以外の場所に保存する。これが漏洩しなければ……

MD5, SHA1の弱さ

幾つかのハッシュ関数は「衝突困難性」が破られている。
How to Break MD5 and Other Hash Functions(MD5 の衝突を効率的に発見する方法)
Finding Collisions in the Full SHA-1(同様に SHA-1 の衝突について)
比較的短い文字列で衝突させた例。72字。(解析ツールのHashClashを使用)

そのため、電子政府における調達のための「推奨候補暗号リスト」からも外れている。 https://www.cryptrec.go.jp/list/cryptrec-ls-0001-2022.pdf

総当たり

グラフィックボードが性能アップし、総当たりで解析する時間が短縮された。

パスワード(8文字・英大文字・小文字・数字)をSHA-1を総当たりで解析するとすると ⇒ (26+26+10)8=約220兆通り
1文字目 a の SHA1 = 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
b = e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 引き続き...c......z まで
2文字目 aa...ab...az...ba...bb...bz...
と順番にすべて見ていき、元の文字列を知りたいハッシュ値と突き合わせて確認する。

同様に、パスワード(8文字・英大文字・小文字・数字)のMD5ハッシュ化 を解析する場合、
RTX 4090を使うと220兆通りが22分で解析される。
Are Your Passwords in the Green?

次回:やられアプリ BadTodo - 17.4 ハッシュの解析(hashcat を使う) - demandosigno
実際にハッシュの総当たり解析をします。

参考にした資料

www.youtube.com

www.youtube.com

www.youtube.com

xtech.nikkei.com

pc.watch.impress.co.jp

その他の資料

MD5は簡単に衝突させられる - Buri Memo:
MD5の安全性の限界に関する調査研究報告書(pdf)

後日試します
qiita.com

/* -----codeの行番号----- */