RS256 と HS256 ってなにが違うの


原文
http://stackoverflow.com/questions/39239051/rs256-vs-hs256-whats-the-difference
以下は、RS2561およびHS2562をJWTの署名に用いる場合の文章です。

RS256 と HS256

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

RS256

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

HS256

一方、HS256は、対称アルゴリズムであり、2つの当事者間で共有される1つの(秘密)鍵のみを使用します。署名を生成して検証するために同じ鍵が使用されるので、鍵が侵害されていないことを保証するように注意する必要があります。JWTを使用するアプリケーションを開発する場合は、誰が秘密鍵を使用するかを開発者(あなた)が制御できるため、HS256を安全に使用することができます。

どちらがいいの?

開発者(あなた)がクライアントを制御できない場合、または秘密鍵を保護する方法がない場合、コンシューマが公開鍵を知るだけでよい、RS256が適しています3。公開鍵は通常、メタデータのエンドポイントから入手することが可能なため、開発者(あなた)はクライアントが自動的に公開鍵を取得するようにプログラムすることができます。多くの場合、ライブラリがサーバから公開鍵を取得します処理を持っているため、あなたの作業は少なくなります。一方、秘密鍵は帯域外で交換する必要があり(セキュアな通信チャネルを確保する必要があります)、署名鍵の更新があった場合は、共有済みの古い秘密鍵を新しいものに手動で更新する必要があります。

ざっくり書くと...

共通鍵 採用すべきは
利用可能なら... HS256
利用不可能なら... RS256

  1. RSA using SHA-256 hash 

  2. HMAC using SHA-256 hash 

  3. 結局、2つのアプリケーションで共通鍵を持てる場合はHS256で、そうでない場合はRS256くらいの認識でいいかと。