はじめに
こんにちは!!!
Laravelと情報処理安全確保支援士(セキスペ)を勉強中のIT初学者です。
スマホのロック解除みたいなパターン認証をWebアプリでも使いたい!!!
と思い、 「チャレンジレスポンス型パターン認証風のデモアプリ」を学習も兼ねてLaravelで実装してみました。
本記事では、作成して思ったことを共有させていただきたいと思います。
作ったもの
概要: サーバーから送られてくる「チャレンジ」を利用し、フロントエンドでユーザーが入力した「パターン」を使って「レスポンス」を作成・送信し検証する
詳細はこちら(Github) : Laravel Challenge-Response Auth
なぜ作ったのか
理由1. カッコいいから(好きだったから)
- しかし最近はスマホも指紋認証しか使わないので
理由2. 文字のパスワードに飽きたから
- 個人開発で従量課金は嫌!極力メールやSMSは使いたくない(甘え)
- 認証アプリはPCメインの自分にとってめんどくさい(甘え)
理由3. こっちの方がオフライン攻撃に強いと思っていたから
気づいたこと
パターン認証風のデモアプリの作成を通じて、「文字のパスワード」 の方が良いなと感じました。
理由1. パスワードのマスキング
パターン認証の場合、画面上に 「認証パターン」 を表示する必要があります。(消したらマトリクス認証?みたいな感じになのかも)
ここで問題になるのが、以下の2つの攻撃
- ショルダーハッキング(覗き見): 後ろから画面を見られたら一発でバレる
- スクリーンロガー: 画面のスクショを送るマルウェアに感染していた場合、パターンが記録される
一方で、従来の「パスワード」は?
-
input type="password"にすれば、ブラウザは文字を •••••••• と黒丸に変換-
→後ろから見ても文字数しかわからない
-
→スクリーンショットを撮られても黒丸しか写らない
-
理由2: オフライン攻撃耐性の勘違い
当初は、このデモのチャレンジレスポンス型の 「パターン認証」 の方が 「パスワード認証」 よりオフライン攻撃に強いと勘違いしていました。
通信を盗聴されチャレンジとレスポンスの両方を取得された場合を想定できていなかったためです。
今回作成したデモのパターン数の場合:
デモアプリのパターン組み合わせ数は、合計で 約22兆通り になります。
(グリットが4×4を想定)
\sum_{k=1}^{16} k! = 1! + 2! + 3! + \cdots + 16! \approx 22\text{兆}
パスワードの場合:
パスワードのパターン組み合わせ数は、合計で 約218兆通り になります。
(英大文字・小文字・数字から8文字を想定)
(26 + 26 + 10)^8 = 62^8 \approx 218\text{兆}
結論
「パスワード(文字)」の方がいいよ!
理由:
- 文字のパスワードの方がオフライン攻撃に強い
- ショルダーハッキング・覗き見、スクリーンロガーなどに対し弱い
- 覚えにくい(パスワードみたいに自動入力とかには多分できない)
最後に
そもそも現在は、パスワードやパターンによる認証は推奨されませんが、
それでも、
スマホのロック解除みたいなパターン認証をWebアプリでも使いたい!!!
と思っている酔狂な方にとっては、このデモアプリ、役に立つかもです。
主要な認証ロジックはServiceクラスにまとめてあり、コピペで再利用しやすく設計してあります。
よかったらご自由にどうぞ。
リポジトリ(Github) : Laravel Challenge-Response Auth
コメントやフィードバックいただけると幸いです。
