SRP (Secure Remote Password) 認証を使用したサンプルログインアプリケーション
このアプリケーションは、SRPの本来の設計思想に沿った実装を採用しています:
- ✅ パスワードがネットワーク上を一切流れない
- ✅ パスワードはブラウザ内でのみ使用される
- ✅ バックエンドがパスワードを見ることがない
- ✅ 中間者攻撃に対して強い耐性
1. フロント: SRP_A生成
↓
2. フロント → バックエンド: { email, srp_a } ← ✅ パスワードなし
↓
3. バックエンド → SaaSus API → バックエンド → フロント: { srp_b, salt, secret_block, ... }
↓
4. フロント: パスワードで署名計算 ← ✅ パスワードはローカルのみ
↓
5. フロント → バックエンド: { username, signature, timestamp, secret_block } ← ✅ パスワードなし
↓
6. バックエンド → SaaSus API → バックエンド → フロント: { access_token, id_token, refresh_token }
2つのエンドポイントで構成:
-
POST /challenge - チャレンジパラメータ取得
- 入力:
{ email, srp_a } - 出力:
{ srp_b, salt, secret_block, pool_name, username, session }
- 入力:
-
POST /verify - 署名検証
- 入力:
{ username, signature, timestamp, secret_block, session } - 出力:
{ access_token, id_token, refresh_token }
- 入力:
- SRP計算: 自前実装(AWS Cognito互換)
- 暗号化ライブラリ:
crypto-js(SHA-256、HMAC、HKDF) - BigInteger演算:
big-integer - HTTPクライアント:
axios
- Go 1.24以上
- Node.js 16以上
- SaaSus アカウント
バックエンド用の.envファイルを作成:
cd backend-go
cp .env.example .env.envファイルを編集:
SAASUS_SAAS_ID=your-saas-id
SAASUS_API_KEY=your-api-key
SAASUS_SECRET_KEY=your-secret-key
PORT=80cd backend-go
go run main.goサーバーは http://localhost で起動します(デフォルトポート: 80)。
cd frontend
npm install
npm startアプリケーションは http://localhost:3000 で起動します。
github.com/labstack/echo/v4- Webフレームワークgithub.com/saasus-platform/saasus-sdk-go- SaaSus SDKgithub.com/joho/godotenv- 環境変数管理
react- UIフレームワークtypescript- 型安全性axios- HTTPクライアントcrypto-js- 暗号化ライブラリ(SHA-256、HMAC、HKDF)big-integer- BigInteger演算ライブラリ
frontend/src/lib/srpAuth.tsに実装:
export class SRPAuthHelper {
// SRP_A(公開値)を生成
public getLargeAValue(): string
// パスワードからHKDFキーを計算
public getPasswordAuthenticationKey(
userPoolName: string,
username: string,
password: string,
serverBValue: string,
salt: string
): number[] // 16バイトのHKDFキー
// 署名を生成
public getSignature(
userPoolName: string,
username: string,
secretBlock: string,
dateNow: string,
hkdfKey: number[]
): string // Base64エンコードされた署名
}
// タイムスタンプ生成(AWS Cognito互換フォーマット)
export const getNowString = (): string実装の特徴:
- AWS Cognito SRP認証プロトコルと完全互換
- 3072-bit safe prime (N) を使用
- HKDF (HMAC-based Key Derivation Function) による鍵導出
- すべての暗号化処理をブラウザ内で完結
backend-go/main.goに実装:
// チャレンジエンドポイント
func challenge(c echo.Context) error
// 検証エンドポイント
func verify(c echo.Context) errorこのアプリケーションは、AWS Cognito互換のSRP認証プロトコルを実装しています:
-
クライアント側(フロントエンド):
- ランダムな秘密値
aを生成 - 公開値
A = g^a mod Nを計算 - サーバーから受け取った
Bとsaltを使用 U = H(A | B)を計算x = H(salt | H(userPoolName | username | ":" | password))を計算- 共有秘密
S = (B - k * g^x) ^ (a + U * x) mod Nを計算 - HKDF で鍵を導出:
hkdfKey = HKDF(S, U, "Caldera Derived Key") - HMAC-SHA256 で署名を生成
- ランダムな秘密値
-
サーバー側(バックエンド):
- クライアントから
Aを受け取り、SaaSus APIに転送 - SaaSus APIから
B、salt、secret_blockを受け取り、クライアントに返す - クライアントから署名を受け取り、SaaSus APIで検証
- 検証成功時にトークンを返す
- クライアントから