Skip to content

署名アルゴリズム

CyberGo JWT は 4 種類計 12 の署名アルゴリズムをサポートし、モノリスからマイクロサービスアーキテクチャまであらゆるシーンに対応します。

アルゴリズム一覧

アルゴリズム鍵の型適用シーン
HMACHS256 / HS384 / HS512対称鍵モノリスアプリ、シンプルなサービス
RSARS256 / RS384 / RS512公開鍵/秘密鍵マイクロサービス、マルチサービス検証
RSA-PSSPS256 / PS384 / PS512公開鍵/秘密鍵マイクロサービス(RSA の代替として推奨)
ECDSAES256 / ES384 / ES512公開鍵/秘密鍵高パフォーマンスマイクロサービス

HMAC(対称鍵)

HMAC は同じ鍵で署名と検証を行う、最もシンプルな方式です。

鍵の要件

  • 最低 32 バイト
  • ライブラリは弱鍵を自動検出(純粋な繰り返し文字、単純な増分シーケンスなど)

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SecretKey = "hmac-key-that-has-at-least-32-bytes!"
cfg.SigningMethod = jwt.SigningMethodHS256 // デフォルト値、省略可

アルゴリズムの選択

定数アルゴリズム説明
SigningMethodHS256HMAC-SHA256推奨、パフォーマンスとセキュリティのバランス
SigningMethodHS384HMAC-SHA384より高いセキュリティ
SigningMethodHS512HMAC-SHA512最高セキュリティ

推奨

ほとんどのシーンでは HS256 で十分です。秘密鍵は暗号論的に安全な乱数で生成し、長さは最低 32 バイトにすることを推奨します。

RSA(非対称鍵)

RSA は秘密鍵で署名、公開鍵で検証します。検証側が秘密鍵を保持する必要がないシーンに適しています。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodRS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey(省略可)

検証鍵

VerificationKey は省略可能です。未設定の場合、ライブラリは SigningKey を使用して検証を行います(内部で秘密鍵から公開鍵を抽出します)。

鍵の生成

go
// 2048 ビット RSA 鍵ペアの生成
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

アルゴリズムの選択

定数アルゴリズム説明
SigningMethodRS256RSA-SHA256推奨
SigningMethodRS384RSA-SHA384より高いセキュリティ
SigningMethodRS512RSA-SHA512最高セキュリティ

RSA-PSS(非対称鍵、RSA の代替として推奨)

RSA-PSS は RSA の改良された署名方式で、確率的署名方式(PSS)パディングを使用し、PKCS#1 v1.5 より安全性が高いです。鍵は RSA と同じです。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodPS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey(RSA と鍵を共有)
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey(省略可)

推奨される代替

RSA-PSS は RSA PKCS#1 v1.5 より安全です。新規プロジェクトでは RSA-PSS アルゴリズムを優先して使用することを推奨します。鍵は RSA と完全に同じため、追加の生成は不要です。

アルゴリズムの選択

定数アルゴリズム説明
SigningMethodPS256RSA-PSS-SHA256推奨
SigningMethodPS384RSA-PSS-SHA384より高いセキュリティ
SigningMethodPS512RSA-PSS-SHA512最高セキュリティ

ECDSA(楕円曲線)

ECDSA も非対称アルゴリズムですが、鍵が短く、パフォーマンスに優れています。

使用方法

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodES256
cfg.SigningKey = ecdsaPrivateKey      // *ecdsa.PrivateKey
cfg.VerificationKey = ecdsaPublicKey  // *ecdsa.PublicKey(省略可)

鍵の生成

go
// P-256 曲線鍵ペアの生成
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

アルゴリズムの選択

定数アルゴリズム曲線説明
SigningMethodES256ECDSA-SHA256P-256推奨
SigningMethodES384ECDSA-SHA384P-384より高いセキュリティ
SigningMethodES512ECDSA-SHA512P-521最高セキュリティ

選び方

text
モノリスアプリ ────────→ HMAC
マイクロサービス(同一信頼ドメイン) → HMAC
マイクロサービス(クロスサービス検証)→ RSA、RSA-PSS または ECDSA
セキュリティ優先 ──────→ RSA-PSS(RSA の代替)
高性能要件 ───────────→ ECDSA
鍵長に敏感 ───────────→ ECDSA
考慮要素HMACRSARSA-PSSECDSA
署名速度速いやや遅いやや遅い速い
検証速度速い速い速い速い
鍵長32+ バイト2048+ ビット2048+ ビット256+ ビット
署名長固定長い(~256 バイト)長い(~256 バイト)短い(~64 バイト)
アーキテクチャ結合密結合疎結合疎結合疎結合
セキュリティ高い高いより高い高い

セキュリティ上の注意

禁止事項

  • コードに秘密鍵をハードコードしない
  • 弱鍵(純粋な数字、繰り返し文字など)を使用しない
  • none アルゴリズムを使用しない(本ライブラリは自動的に拒否します)
  • HMAC 秘密鍵を 32 バイト未満にしない

ベストプラクティス

  • 環境変数または鍵管理サービスで秘密鍵を保管
  • 署名鍵を定期的にローテーション
  • 本番環境では RSA または ECDSA の使用を推奨
  • RSA 鍵は 2048 ビット以上を推奨

次のステップ