私はHTTPを作成していますRESTサービスはtlsでのみ利用できます。
認証の目的で、HMAC HS256
を使用するすべてのユーザーに対して[〜#〜] jwt [〜#〜]トークンを生成する予定です。 HMACには秘密鍵が必要です。
secret keyの要件は何ですか?
ランダムな文字の長い文字列が必要ですか?または固定長文字列?または何?
既存の質問では私の好みに十分に対応できないので、ここに私の回答を追加しました。
RFC 4868 を見てみましょう(IPSecに関しては、使用するHMAC-SHA256関数をカバーしています-em mine) :
ブロックサイズ:基になるハッシュアルゴリズムが操作するデータブロックのサイズ。 SHA-256の場合、これは512ビットです。SHA-384およびSHA-512の場合、これは1024ビットです。
出力長:基になるハッシュアルゴリズムによって生成されるハッシュ値のサイズ。 SHA-256の場合、これは256ビット、SHA-384の場合、これは384ビット、SHA-512の場合、これは512ビットです。
WhiteWinterWolf notes のように、最初にSHA-256を使用して値をハッシュする必要があるため(この場合は512ビット)、L未満(この場合は256ビット)であるため、Bより長くすることはお勧めしません。ただし、256ビットのキーは、世界中のすべてのコンピューターがクラックに取り組んでいたとしても、128ビット以上の何かを現在のライフタイムでブルートフォースにすることはできないため、やり過ぎです。
したがって、私は128ビットの鍵をお勧めします。これは、暗号的に安全な疑似乱数ジェネレーター(CSPRNG)で生成されます。これをテキストとして保存する場合は、ランダムな32文字長の16進文字列を生成することによって128ビットのキーを表すことができます。または、16のランダムバイトを生成して、base64関数で実行することもできます。
RFC 7518 -JSON Web Algorithms(JWA)によると:
このアルゴリズムでは、ハッシュ出力と同じサイズ(たとえば、「HS256」の場合は256ビット)以上の鍵を使用する必要があります。 (この要件は、NISTのセクション5.3.4(HMACキーのセキュリティ効果)に基づいていますSP 800-117(sic)[ NIST.800-107 ] 、有効なセキュリティ強度はキーのセキュリティ強度の最小値であり、内部ハッシュ値のサイズの2倍であると述べています。)
したがって、JWTの場合、HS256では少なくとも256ビットのキーを使用する必要があります。
RFC 2104 HMAC関数を定義すると、次の質問に回答します。
HMACのキーの長さは任意です(Bバイトより長いキーは、最初にHを使用してハッシュされます)。ただし、関数のセキュリティ強度が低下するため、Lバイト未満の使用はお勧めしません。 Lバイトより長いキーは受け入れられますが、追加の長さは機能強度を大幅に増加させません。 (キーのランダム性が弱いと考えられる場合は、キーを長くすることをお勧めします。)
鍵はランダムに(またはランダムシードがシードされた強力な疑似ランダムジェネレーターを使用して)選択し、定期的に更新する必要があります。 (これらの攻撃は実質的に実行不可能であるため、現在の攻撃は、キー変更の特定の推奨頻度を示していません。ただし、定期的なキーの更新は、機能とキーの潜在的な弱点を防ぎ、公開されたキーの損傷を制限する基本的なセキュリティ対策です。 )
詳細については、この抜粋では次の表記が使用されています。
Hは、データのブロックに対して基本的な圧縮関数を反復することによってデータがハッシュされる暗号化ハッシュ関数であると想定します。そのようなブロックのバイト長をBで示し(ハッシュ関数の上記のすべての例ではB = 64)、Lでハッシュ出力のバイト長を示します(MD5の場合はL = 16、SHA-1の場合はL = 20) )。
編集:間違った答え。コメントスレッドを保持するために、削除せずに残しました。
特定のハッシュアルゴリズムのブロックサイズよりも長いHMACユーザー入力キーは、最初に短縮されます。 (ハッシュを介して長いキーを実行し、そのハッシュを実際のキーとして使用する。)
SHA256は256ビットのハッシュを出力します。これは32バイトです。したがって、256ビットのHMAC秘密鍵を生成することをお勧めします。 (暗号的に安全なランダムジェネレーターを使用します。)鍵はもはや追加のセキュリティを提供しません。