ユーザーアイコン

mizuko

3日前

0
0

Go言語でのセキュアなAPIキー生成と管理の実装パターン

Go
セキュリティ
認証

APIキーの生成と管理において実装したセキュリティ対策のパターン。

1. APIキー生成のセキュリティ要件

  • crypto/rand を使用してセキュアなランダムバイトを生成
  • 32バイトの十分な長さで予測困難性を確保
  • Base64 URL-safe エンコーディングで安全な文字列に変換
  • プレフィックス(pk_paput_)でサービス識別と偽造防止

2. ハッシュ化による保存

  • 平文のAPIキーはDBに保存せず、HMAC-SHA256でハッシュ化
  • HMACを使用することで同じ入力に対して同じ出力を保証
  • ハッシュから元のキーを復元不可能にすることで漏洩時の被害を最小化

3. 検証とバリデーション

// 形式検証の実装例 func ValidateApiKeyFormat(apiKey string) error { // プレフィックスチェック if !strings.HasPrefix(apiKey, ApiKeyPrefix) { return fmt.Errorf("invalid prefix") } // 長さチェック(DoS対策含む) minLength := len(ApiKeyPrefix) + 40 if len(apiKey) < minLength || len(apiKey) > 256 { return fmt.Errorf("invalid length") } return nil }

4. 有効期限管理

  • デフォルト365日、最大730日の有効期限設定
  • 期限切れチェックをミドルウェアで実装
  • ローテーション機能で定期的な更新を促進

5. クリーンアーキテクチャでの配置

  • インフラ層(infrastructure/auth/apikey)に純粋なユーティリティとして実装
  • リポジトリ依存を排除し、ハッシュ化と検証のみを担当
  • ビジネスロジック(ユーザー検索等)はユースケース層で実装

6. テスト戦略

  • ユニーク性の検証(100回生成して重複なし)
  • ハッシュの不可逆性確認
  • プレフィックスと長さの境界値テスト