AWS Cognitoには SRP(Secure Remote Password) という認証方式があります。
これはパスワードをサーバーに送信せずにログインを証明する仕組みです。
SRP認証とは
SRP(Secure Remote Password)は、Zero Knowledge Proof(ゼロ知識証明)を利用した認証プロトコルです。
通常のログインでは次のような通信が行われます
Client → Server username + password
この場合、通信が盗聴されるとパスワードが漏洩するリスクがあります
SRPでは
Client → Server username + 証明データ
パスワード自体は一切送信されません。
① ユーザー登録
ユーザー登録時、パスワードはそのまま保存されません
x = H(salt | password) v = g^x mod N
保存パスワードはサーバーに保存されません。
② ログイン開始
クライアントはランダム値を生成
a = random A = g^a mod N
Cognitoへ送信の場合パスワードは含まれない
③ サーバー応答
サーバーはランダム値を生成
b = random B = kv + g^b mod N
クライアントへ送信
④ 共通セッションキー生成
クライアント
x = H(salt | password) u = H(A | B) S = (B - kg^x)^(a + ux) mod N K = H(S)
サーバー
u = H(A | B) S = (A * v^u)^b mod N K = H(S)
結果として、同じセッションキーKが生成されます。
⑤ 認証証明
クライアントは証明を送信
M1 = H(A | B | K)
サーバーが確認後、問題なければログイン成功
さらにサーバーも証明
M2 = H(A | M1 | K)
SRPが安全な理由
- パスワード送信不要
- ゼロ知識証明
- リプレイ攻撃防止
- パスワード漏洩リスク低減
- OAuthとの相性
Cognito SRPのAPIフロー
Cognitoでは以下のAPIでSRP認証が行われます。
InitiateAuth AuthFlow = USER_SRP_AUTH
レスポンス
ChallengeName = PASSWORD_VERIFIER
その後
RespondToAuthChallenge
で認証が完了します。
無音カメラアプリ
無音ガメラ Web版
Jsree
JSON/JSONLファイルをツリー表示して編集できる無料オンラインツール

