Jwt

RS256とHS256:違いは何ですか?



Rs256 Vs Hs256 Whats Difference



解決:

どちらの選択肢も、IDプロバイダーが使用するアルゴリズムを参照しています サイン JWT。署名は、トークンの受信者がトークンが改ざんされていないことを確認するために検証できる「署名」(JWTの一部)を生成する暗号化操作です。

  • RS256(SHA-256を使用したRSA署名)は非対称アルゴリズムであり、公開鍵と秘密鍵のペアを使用します。IDプロバイダーには署名の生成に使用される秘密(秘密)鍵があり、JWTのコンシューマーは公開鍵を取得します。署名を検証します。秘密鍵とは対照的に、公開鍵を保護する必要がないため、ほとんどのIDプロバイダーは、消費者が(通常はメタデータURLを介して)簡単に取得して使用できるようにします。



  • 一方、HS256(HMACとSHA-256)には、ハッシュ関数と、署名として機能するハッシュを生成するために使用される2つのパーティ間で共有される1つの(秘密)キーの組み合わせが含まれます。署名の生成と検証の両方に同じキーが使用されるため、キーが危険にさらされないように注意する必要があります。

JWTを使用するアプリケーションを開発する場合は、秘密鍵を使用するユーザーを制御できるため、HS256を安全に使用できます。一方、クライアントを制御できない場合、または秘密鍵を保護する方法がない場合、コンシューマーは公開(共有)鍵を知っているだけでよいため、RS256の方が適しています。



公開鍵は通常メタデータエンドポイントから利用できるため、クライアントは公開鍵を自動的に取得するようにプログラムできます。この場合(.Net Coreライブラリの場合と同様)、構成で行う作業が少なくなります(ライブラリはサーバーから公開鍵をフェッチします)。一方、対称鍵は帯域外で交換する必要があり(安全な通信チャネルを確保)、署名鍵のロールオーバーがある場合は手動で更新する必要があります。

Auth0は、公開鍵を取得できるOIDC、SAML、およびWS-Fedプロトコルのメタデータエンドポイントを提供します。これらのエンドポイントは、クライアントの[詳細設定]の下に表示されます。

たとえば、OIDCメタデータエンドポイントは次の形式を取ります。https:// {アカウントドメイン} /。well-known / openid-configuration。そのURLを参照すると、への参照を含むJSONオブジェクトが表示されます。https:// {account domain} /。well-known / jwks.json。アカウントの公開鍵(または複数の鍵)が含まれています。



RS256サンプルを見ると、公開鍵をどこにも構成する必要がないことがわかります。公開鍵はフレームワークによって自動的に取得されます。


暗号化では、使用されるアルゴリズムには2つのタイプがあります。

対称アルゴリズム

データの暗号化には単一のキーが使用されます。キーで暗号化すると、同じキーを使用してデータを復号化できます。たとえば、メアリーがキー「my-secret」を使用してメッセージを暗号化し、それをジョンに送信した場合、メアリーは同じキー「my-secret」を使用してメッセージを正しく復号化できます。

非対称アルゴリズム

メッセージの暗号化と復号化には2つのキーが使用されます。 1つのキー(パブリック)はメッセージの暗号化に使用されますが、もう1つのキー(プライベート)はメッセージの復号化にのみ使用できます。したがって、ジョンは公開鍵と秘密鍵の両方を生成し、公開鍵のみをメアリーに送信してメッセージを暗号化できます。メッセージは、秘密鍵を使用してのみ復号化できます。

HS256およびRS256シナリオ

これらのアルゴリズムは、データの暗号化/復号化には使用されません。むしろ、それらはデータの出所または信憑性を検証するために使用されます。メアリーがオープンメッセージをジョンに送信する必要があり、メッセージがメアリーからのものであることを確認する必要がある場合は、HS256またはRS256を使用できます。

HS256は、単一のキーを使用して、特定のデータサンプルの署名を作成できます。メッセージが署名とともに送信される場合、受信側は同じキーを使用して、署名がメッセージと一致することを確認できます。

RS256は、キーのペアを使用して同じことを行います。署名は、秘密鍵を使用してのみ生成できます。また、署名を検証するには公開鍵を使用する必要があります。このシナリオでは、ジャックが公開鍵を見つけたとしても、メアリーになりすますための署名付きのなりすましメッセージを作成することはできません。


パフォーマンスに違いがあります。

簡単に言えばHS256は、より約1桁高速です。検証用のRS256ですが、より約2桁高速です発行(署名)用のRS256。

640,251 91,464.3 ops / s 86,123 12,303.3 ops / s(RS256検証)7,046 1,006.5 ops / s(RS256記号)

実際の数にとらわれるのではなく、お互いを尊重して考えてください。

[Program.cs]

class Program {static void Main(string [] args){foreach(var duration in new [] {1、3、5、7}){var t = TimeSpan.FromSeconds(duration); byte [] publicKey、privateKey; using(var rsa = new RSACryptoServiceProvider()){publicKey = rsa.ExportCspBlob(false); privateKey = rsa.ExportCspBlob(true); } byte [] key = new byte [64]; using(var rng = new RNGCryptoServiceProvider()){rng.GetBytes(key); } var s1 = new Stopwatch(); var n1 = 0; using(var hs256 = new HMACSHA256(key)){while(s1.Elapsed