ストレッチング処理とは?
ハッシュ化された文字列に対して更にハッシュ化の処理を行う
* n
を行う処理
ハッシュ化されたパスワード
(と 利用したソルト
) が悪意のある第三者に渡った場合でも、解析までの時間を稼ぐ事ができる
パスワードをハッシュ化して保存する処理 に対する個人的な感想
- ソルト処理 (パスワードに適当な文字列を付加してからハッシュ化)
- やらなきゃだめだよね!
- ストレッチング (ハッシュ化された文字列をハッシュ化 * n)
- やりたくねぇぇぇ
以下は個人的な感想です(´・ω・`)
ストレッチングが手軽で有効なのはわかるんだけど・・・という気持ちをまとめてみました。
抵抗を感じる理由
高速に動作する処理を複数回実行して低速に!
もともと、プログラムを書いていて、「ハッシュを使いたい!」と思う場面では、「高速」であるからハッシュを使っている、ということが多い。
- データ比較処理の高速化 (自分の感覚ではログインなどの認証もここに入る)
- 検索の高速化 (ハッシュテーブルにキーを入れてデータを引っ張りたい的な)
- (リアルタイムで)改竄の検出
など。
なので、
- 高速に動作するから利用している処理
を複数回実行することで
- 低速になってしまう!
というところに抵抗を感じます。
ストレッチの回数に対して線形でしか解析時間が伸びない
肉を切らせて肉を切る
という感じになっているんじゃないかというところも、もやもやするところです。
ハッシュの生成にかかる時間と、解析にかかる時間に大きな差があるから有効であるとはわかっているんですが。
実装は手軽だけど、ストレッチングかかる負荷は長期的に見ると大きなコストがかかっているのと同じでは?
これは、実装するシステムの現在の負荷と将来の負荷によるとしかいえませんが。
まとめ
とはいっても、総当りでやられちゃいそうなパスワードルールだったら、やらないわけにはいけないよね!