認証

認証

執筆済 ソフトウェア開発セキュリティ

認証 (authentication) = 誰であるかを確かめる。 認可 (authorization) = 何をしてよいかを決める。

混同されやすいが別の問題。

方式#

方式 特徴
パスワード 実装は簡単。使い回し・漏洩に弱い
多要素認証 (MFA) 知識 + 所持 + 生体。最も効果が大きい
パスキー / WebAuthn 公開鍵暗号。フィッシングに原理的に強い
OAuth 2.0 / OIDC 他サービスに委任する
生体認証 端末内で検証。鍵の解錠に使う

パスワードの保存#

平文で保存してはいけない。 ハッシュ化する。 しかも高速なハッシュ(SHA-256 など)は不適切で、 意図的に遅い関数を使う。

推奨 特徴
Argon2id メモリも要求する。現在の第一候補
bcrypt、scrypt 実績がある

各ユーザに異なるソルトを付け、 レインボーテーブルを無効にする。

トークン#

種類 寿命 保存場所
アクセストークン 短い(数分〜1 時間) メモリ
リフレッシュトークン 長い キーチェーン等の安全な場所

短命なアクセストークンと長命なリフレッシュトークンに 分けるのは、漏洩時の被害を時間で限定するため。

OAuth 2.0 / OIDC#

OAuth は認可の枠組みであって認証ではない。 「このアプリに、あなたの写真を読む権限を与えますか」を扱う。

認証(本人確認)が必要なら、 その上に構築された OpenID Connect を使う。 OAuth を認証に流用した実装は脆弱になりやすい。

ネイティブアプリでは PKCE 付きの認可コードフローが必須。 インプリシットフローは非推奨。

参考文献#

ノート一覧を閉じる