Cognito SRP認証を理解する(Secure Remote Passwordとは?)

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 スクショ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA