パスワード保存時の暗号化の基本
ハッシュ(パスワード文字列をハッシュ化 shaとか色々ある)
ソルト(付加文字)
ストレッチ(複数回、暗号化を繰り返す)
パスワードアルゴリズムの変更に対応するために
$1$hogehoge
ハッシュ値の保存時に、パスワードの保存方式を示すマークを
付けたりするようです。上記だと、「\$1\$」の部分。
実践的な方法(参考記事)
アルゴリズムは実行時間の長いBCryptとかが良い
shaアルゴリズムだと、計算スピードが速いので、億の回数試すとか簡単に出来てしまうらしい。
ソルトとかストレッチ
引用
生成したソルト = \$2a\$10\$SvWYQgx/AKizANy.tp6zDu
ハッシュ化したパスワード = \$2a\$10\$SvWYQgx/AKizANy.tp6zDulPku8eglSnopMcyi5cIRQY1Efa6cIUW
hogePassword1234の検証結果 = true
hogePassword12345678の検証結果 = false\$2a\$10\$という部分の2aがバージョン(特に意味無し)で、
10という部分がストレッチングの回数(累乗ですので、2^10 = 1024)です。
ソルトとストレッチ回数をパスワードに含めると、アルゴリズムの変更
にも耐えられます。
また、上記を見ただけでは「どこからがソルトで、どこからがhashか?」
書いてなければ、分からない状態になっています。
基本的な考え方
引用
攻撃者が各反復で全アカウントに対して試せるようにするのではなく、
各アカウントに個別にフォーカスさせるよう
各ユーザに対してユニークなsalt値と反復カウントを用意することだ。
なるほど。
まとめ
参考記事にも書いてありますが、将来まで絶対安全な方法は無いというのを
踏まえて、まとめると
- 暗号化方式を変えられるようにすること
- 全アカウント異なるソルト・反復カウントを使うこと
- ある程度実行に時間が掛かるアルゴリズムを使うこと
という感じでしょうか。
他に、「もっとこういうのもあるよ」的なのがあれば、
気軽にコメントおねがいしますm(_ _)m