Secure Remote Password (SRP) プロトコル
Secure Remote Password (SRP) プロトコルは,ネットワークの認証方式であり,暗号化されていない通信路を介してユーザ名とパスワードを使った認証を行う.また,SRP は認証とともに暗号鍵を生成するための共有情報を提供し,安全な鍵交換を実現する.
SRP アルゴリズムの利点は,セキュアな通信チャンネルがなくても単純ななテキストパスワードを使用してクライアントとサーバの相互認証が可能になることである.また,信頼できる鍵サーバや証明書インフラストラクチャは必要なく,クライアントは長期間鍵を保存,管理する必要もない.
- RFC 2945 - The SRP Authentication and Key Exchange System
- RFC 5054 - Using the Secure Remote Password (SRP) Protocol for TLS Authentication
方式概要
- 記法
プロトコルの説明に次の記法を用いる.
$N$ : 素数(全ての演算は法 $N$ で行う)
$g$ : 法 $N$ の乗法群の生成元
$s$ : ソールト (乱数種)
$I$ : ユーザ名
$P$ : ユーザパスワード
$\mathrm{H}()$ : ハッシュ関数 (SHA-256 など)
$v$ : 検証関数( $v = g^x, x = \mathrm{H}(s, I, P)$ )
$A$, $a$ : クライアントの公開値と秘密値(乱数)
$B$, $b$ : サーバの公開値と秘密値(乱数)
| : データの結合
- 鍵共有手順 (SRP-6)
事前準備として,クライアント(ユーザ) $C$ のパスワード $P$ の情報をサーバ $S$ に設定する.
サーバ $S$ は,小さな乱数 $s$ と $x = \mathrm{H}(s, I, P)$ ,$v = g^x$ を計算し,$v$ と $s$ を $C$ のパスワード情報とソールトとして格納する.このとき,これらの情報はクライアント $C$ の名前 $I$ で検索できるようにする.その後,$x$ は平文パスワードと等価であるため破棄する.
クライアント $C$ とサーバ $S$ が同じ鍵を共有するには,次の手順を実行する.
- $C$: $I \rightarrow S$
$S$:(lookup $s, v$)
- $S$: $s \rightarrow C$
C:
$x = \mathrm{H}(s, I, P)$
- $C$: $A = g^a$,$A \rightarrow S$
$S$: $B = 3 v + g^b$,$B \rightarrow C$
$C$: $u = \mathrm{H}(A, B)$
$S$: $u = \mathrm{H}(A, B)$
- $C$: $S_c = (B - 3 g^x)^{(a + ux)}$
$S$: $S_s = (Av^u)^b$
- $C$: $M1 = \mathrm{H}(A, B, S_c)$,$M1 \rightarrow S$
$S$:(Verify $M1$)
- $S$: $M2 = \mathrm{H}(A, M1, S_s)$,$M2 \rightarrow C$
$C$:(Verify $M2$)
- $C$: $K = \mathrm{H}(S_c)$
$S$: $K = \mathrm{H}(S_s)$
上記により, $C$ と $S$ は同じ共有鍵 $K$ を得る.また,$M1$ と $M2$ を検証することにより,お互いの鍵が一致することが確かめられ相互認証される.
TLS_SRP
- プロトコル概要
SRP プロトコルを用いる場合の TLSハンドシェイクの概要を示す.
sequenceDiagram
Client->> Server: Client Hello (I)
Server->> Client: Server Hello
opt Send Certificate
Server-->> Client: Certificate
end
Server->> Client: Server Key Exchange (N, g, s, B)
Server->> Client: Server Hello Done
Client->> Server: Client Key Exchange (A)
Note left of Client: {Change Cipher Spec]
Client->> Server: Finished
Note right of Server: [Change Cipher Spec]
Server->> Client: Finished
Server-> Client: Application Data
- 事前設定
ユーザ名 $I$,ソールト $s$,パスワード $P$,群パラメータ ($N$,$g$) を用いて以下の値を計算する.
- $x = \mathrm{SHA1}(s\ |\ \mathrm{SHA1}(I\ |\ ":"\ |\ P))$
- $v = g^x \bmod N$
- Client Hello
ユーザ名が標準的な Client Hello メッセージに拡張メカニズム (SRP extension) により追加される.
- Server Certificate
サーバは,ディジタル署名を使ったサーバ認証を要求する SRP 暗号スイートに同意する場合,証明書を送る必要がある.
- Server Key Exchange
Server Key Exchange メッセージは,素数 $N$,生成元 $g$,ソールト $s$ を送信する.これらは,ユーザ名 $I$ に対応 したパスワードファイルから読込まれるものである. また,以下のサーバの公開値 $B$ を送信する.
$B = 3 v + g^b \bmod N$
ここで,$b$ は少なくとも 256ビット以上の乱数である. サーバが Certificate メッセージ を送信した場合は,このメッセージは署名されねばならない. クライアントは,
$B \bmod N = 0$ ならば,"illegal_parameter" としてプロトコルを強制終了する.
- Client Key Exchange
クライアントは,Client Key Exchange メッセージとして以下のクライアントの公開値 $A$ をサーバに送る.
$A = g^a \bmod N$
ここで,$a$ は少なくとも 256ビット以上の乱数である.
サーバは,$A \bmod N = 0$ ならば,"illegal_parameter" としてプロトコルを強制終了する.
- Finished
Finished メッセージは,クライアントとサーバの証拠メッセージ (M1 と M2) で検証機能を実行する. クライアントまたはサーバのどちらかが,不正なプリマスタシークレットを生成したならば,Finished メッセージは適切な復号に失敗する.他方は "bad_record_mac"を返す.
クライアントアプリケーションが SRP ハンドシェイク中に "bad_record_mac"を受け取ったならば,ユーザに指定したユーザ名とパスワードが不正であることを通知する必要がある.
- プリマスタシークレットの生成
クライアントは,プリマスタシークレット $S_c$ を以下のように計算する.
- $I, P$ : ユーザが指定する.
- $N, g, s, B$ :サーバから取得する.
- $a = random()$
- $A = g^a \bmod N$
- $u = \mathrm{SHA1}(\mathrm{PAD}(A)\ |\ \mathrm{PAD}(B))$
- $x = \mathrm{SHA1}(s\ |\ \mathrm{SHA1}(I\ |\ ":"\ |\ P))$
- $S_c = (B - 3 g^x)^{(a + ux)} \bmod N$
サーバは,プリマスタシークレット $S_s$ を以下のように計算する.
- $N, g, s, v$ :パスワードファイルから読込む.
- $b = random()$
- $B = (3 v + g^b) \bmod N$
- $A$ :クライアントから取得する.
- $u = \mathrm{SHA1}(\mathrm{PAD}(A)\ |\ \mathrm{PAD}(B))$
- $S_s = (A v^u)^b \bmod N$