ユーザIDやメールアドレスとパスワードでの認証が一般的だ。しかし、そのまま平文で管理してしまうと、どんなに複雑で長いパスワードにしてもものの数分、数時間でクラックされてしまう。
Webサービスをつくる上で重要なのはセキュリティ対策だ。
その中でも今回は「ハッシュ化」について学んだので、その内容を活かしてログインフォームを実装してみた。
SHA-256, 512でハッシュ化しログインフォームを実装する
まずはいろいろ説明する前に、実際にSHA-256, 512でユーザIDとパスワードをハッシュ化して認証するログインフォームをみていただきたい。
このログインフォームは、詳しくはあとで説明するが、「ユーザID+パスワード+ソルト」をSHA-256, 512というハッシュ関数を使ってハッシュ化し、データベースに保存されているハッシュと照合し、認証に成功したかどうかを表示する。
「user」と「password」、「check(ログイン)」がログインフォームの最低限の項目。
checkボタンの上にある、sha-256、sha-512のラジオボタンはハッシュ化するときに利用するハッシュ関数を選択する。
「Data stored in database」が実際にDBに保存されている値。
ハッシュ化された値が保存されているので、何が登録されているかわらかないと思うので、「row data」にハッシュ化前の値を表示している。
最下部にある「Salt」と「Stretch」は後ほど説明する。
ログインフォームのセキュリティ対策
ログイン機能などを実装する上で考えなければならない対策は多数ある。
代表的な対策は以下のとおり。
- パスワードの強度チェック(予測困難なパスワードを使う)
- SQLインジェクション攻撃の対策
- ソーシャルハッキングの対策
- 不正ログイン検知によるアカウントロック
- データベースの暗号化
- パスワードのハッシュ化
全部は紹介しきれないので、今回はパスワードのハッシュ化についてまとめる。
ハッシュ化とは
勘違いしやすいのは、ハッシュ化と暗号化はまったく別物だということ。
ハッシュ化とは、元のデータから一定の計算手順に従ってハッシュ値と呼ばれる規則性のない固定長の値を求め、その値によって元のデータを置き換えること。パスワードの保管などでよく用いられる手法である。
ハッシュ化とは|hashing|ハッシング - IT用語辞典
ハッシュ化は、ハッシュ関数という特殊な計算によって不可逆的にランダムな値に置き換えること。
暗号化とは、盗聴されたり改ざんされないように可逆的にデータを変換すること。可逆的なので復号することができる。
ハッシュ化するためのハッシュ関数
先述のとおり、ハッシュ化とはハッシュ関数という特殊な計算によってランダムな値をもとめること。ハッシュ関数にはいくつか種類がある。
- MD5
- SHA-1
- SHA-256
- SHA-512
ハッシュが解読されたときのための対策
説明すると長くなってしまうが、さまざまな方法を使うことでハッシュ値(ハッシュ化された値)から元のパスワードを解読することができてしまう。
そのために、2つの対策を行う。
ソルト(Salt)
ソルトとは、元データに付与して実際のパスワードよりも複雑にするための文字列のことをいう。たとえば「Password」というパスワードに「user01-salt」というソルトを付与し、「Password-user01-salt」という文字列にしてからハッシュ化を行なうことで、同じパスワードでもユーザが異ると生成されるハッシュ値が異る。
総当たり攻撃(Brute-Force Attack)には効果が少ないものの、レインボークラックには有効な対策といえる。
ストレッチング(Stretching)
ストレッチングとは、意図的にハッシュ計算の処理速度を遅くすることで、ソルトでは効果がなかった総当たり攻撃の対策として使うことができる。
CPU性能の向上でハッシュ計算はほんの数msecで終わってしまうので、わざと処理に時間がかかるようにループさせたり、待機させたりして時間を稼ぐ。ストレッチングで処理時間が100msec→1,000msecに伸ばすと、10,000回の総当たり攻撃で1,000secかかるところを10,000secにまで引き延ばすことができる。
これは試行回数が増えれば増えるほど効果的だ。
その他にも対策は考えられるは、今回はこのあたりで。
ちなみに今回紹介したパスワードのハッシュ化は、ストレッチングを除いて総当たり攻撃には効果が少ない。詳細は以下の記事を参照してください。
参考文献・サイト
Web系の仕事に携わるなら、必ず読んで欲しい本がある。
徳丸本と呼ばれている「体系的に学ぶ安全なWebアプリケーションの作り方」だ。
Webセキュリティについて、かなり詳しく書かれており、しかもPHPで書かれたプログラムが付属されて体験しながら学ぶことができる。
ちなみに私はこの本を読んだ翌日、自社サービスの脆弱性を2つ見つけ対策をした。
それくらい即効性のある本なのでぜひ、いや必ず読んでほしい!
「passingloopの日記」では、FAQ方式でなぜ「ソルトとストレッチが必要なのか」がわかりやすくまとめられている。
「Togetter」の方は、徳丸さんが直々にストレッチがなぜ必要なのかを説明してくださっている。
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿