Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Understanding RS256: A Deep Dive into Asymmetric Encryption

2025年10月04日に「Dev.to」が公開したITニュース「Understanding RS256: A Deep Dive into Asymmetric Encryption」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

RS256はJWTのセキュリティを強化する非対称暗号技術だ。署名に使う秘密鍵と検証に使う公開鍵を分けることで、公開鍵が漏れても第三者にトークンを偽造されない。これにより、複数のサービスが安全にトークンを検証できる。

ITニュース解説

ウェブサービスなどでユーザー認証に使われるJWT(JSON Web Tokens)という仕組みを利用する際、RS256という名前を目にしたことがあるかもしれない。これは、トークンの安全性を保証するための重要な暗号アルゴリズムの一つだ。このRS256の裏側では、どのような仕組みが動いているのか、そしてなぜサーバーはトークンを発行した秘密を知らなくてもその正当性を検証できるのか、その詳細を解説する。

まず、HS256という別の署名方式から見てみよう。HS256は「対称暗号」と呼ばれる方式で、トークンを生成する際にも検証する際にも、同じ「秘密鍵」を用いる。例えば、ヘッダーとペイロードを結合し、それを秘密鍵と一緒にHMAC-SHA256というアルゴリズムで処理して署名を作成する。検証時には、受け取ったトークンのヘッダーとペイロードから同じ方法で署名を再作成し、元の署名と比較して一致すれば有効と判断する。この方式の問題点は、トークンを検証するすべてのサービスが同じ秘密鍵を持たなければならない点にある。もし、いずれかのサービスが攻撃者に侵害され、秘密鍵が漏洩してしまうと、攻撃者はその秘密鍵を使って好きなように偽のトークンを作成できてしまい、認証システム全体のセキュリティが破綻してしまう。これは非常に大きなリスクとなる。

この対称暗号の課題を解決するのが、RS256が採用している「非対称暗号」という考え方だ。非対称暗号では、鍵が一つではなく、「秘密鍵」と「公開鍵」というペアで構成される。秘密鍵は絶対に他人に知られてはならない鍵で、主にトークンの署名に使われる。一方、公開鍵は誰にでも共有してよい鍵で、主にトークンの署名の検証に使われる。この鍵ペアの最大の特徴は、秘密鍵で署名されたデータは、そのペアとなる公開鍵でしか検証できず、逆に公開鍵では署名を作成できない点にある。

この仕組みは実際のウェブアプリケーションでどのように機能するのだろうか。例えば、ユーザーが認証サーバーにログインすると、認証サーバーはユーザーの情報を基にJWTを作成する。この際、認証サーバーは自身だけが持つ「秘密鍵」を使ってJWTに署名し、そのトークンをユーザーのブラウザ(フロントエンド)に返す。ユーザーのブラウザは、このトークンを保存し、その後APIサーバーにアクセスする際に、このトークンを添付してリクエストを送る。APIサーバーは、受け取ったトークンを検証する必要があるが、ここで認証サーバーから事前に提供されている「公開鍵」を使用する。APIサーバーは公開鍵を使ってトークンの署名を検証し、正当なトークンであればリクエストを処理し、そうでなければ拒否する。このアーキテクチャでは、秘密鍵は認証サーバーという特定の場所でのみ管理され、APIサーバーには偽造能力を持たない公開鍵だけが渡されるため、たとえAPIサーバーが攻撃されても、秘密鍵が漏洩しない限り攻撃者は偽のトークンを作成することはできないのだ。

RS256のトークン作成と検証の具体的な流れは次のようになる。トークン作成側(認証サーバー)では、まずヘッダーとペイロードという情報を作成し、それぞれBase64URL形式でエンコードする。これらを結合した文字列をSHA256アルゴリズムでハッシュ化し、そのハッシュ値を認証サーバーの「秘密鍵」で暗号化する。この暗号化されたデータがトークンの署名となる。最終的に、エンコードされたヘッダー、ペイロード、そして署名をピリオドで連結することでJWTが完成する。一方、トークン検証側(APIサーバー)では、受け取ったJWTをピリオドで分割し、ヘッダーとペイロードを取り出す。これらを結合してSHA256でハッシュ値を再計算する。同時に、受け取った署名を認証サーバーから提供された「公開鍵」で復号する。もし、再計算したハッシュ値と、署名を復号して得られたハッシュ値が完全に一致すれば、そのトークンは正当であり、改ざんされていないと判断できる。もし攻撃者がペイロードの内容を改ざんしようとしても、元の秘密鍵なしには有効な署名を作成できないため、検証は失敗し、偽造されたトークンは拒否される。

この非対称暗号の安全性の根幹にあるのが、RSA鍵ペアの数学的な生成原理だ。RSA鍵の生成は、以下のステップで行われる。まず、非常に大きな二つの素数pとqを選ぶ。次に、これら二つの積nを計算する。このnは公開鍵と秘密鍵の両方に含まれる「モジュラス」と呼ばれる値だ。そして、オイラーのトーシェント関数φ(n)を計算する。これは(p-1)×(q-1)で求められるが、この値は鍵生成過程でのみ使用され、生成後は破棄されるべき秘密情報だ。その後、公開指数eとして特定の条件を満たす小さな素数(例えば65537)を選ぶ。最後に、eとφ(n)を用いて、(d × e) mod φ(n) = 1という関係を満たす秘密指数dを計算する。こうして、公開鍵(e, n)と秘密鍵(d, n)が生成される。この仕組みの安全性は、巨大な数nをその素因数pとqに分解すること(素因数分解問題)が現在のコンピュータでは極めて困難であるという数学的な事実に基づいている。攻撃者がnからpとqを特定できなければ、φ(n)や秘密指数dを計算することができず、結果として秘密鍵を割り出すことができないため、RSA暗号は非常に堅牢なセキュリティを提供する。

実際にこれらの巨大な数字が、普段目にする「-----BEGIN RSA PRIVATE KEY-----」のようなPEM形式のファイルになる過程も興味深い。生成された大きな数字(n, e, dなど)は、まずバイナリデータに変換される。次に、これらのバイナリデータはASN.1(Abstract Syntax Notation One)という標準形式で構造化され、DER(Distinguished Encoding Rules)という形式でエンコードされる。このDER形式のバイナリデータは、人間が読めるテキスト形式にするためにBase64エンコードが施される。そして最後に、このBase64エンコードされたテキストに、「-----BEGIN RSA PRIVATE KEY-----」や「-----END RSA PRIVATE KEY-----」といったヘッダーとフッター、そして一定の文字数での改行が加えられ、最終的なPEMファイルが完成する。つまり、見た目は複雑な文字列だが、その実体は数学的な関係を持つ巨大な数字が特定のルールに従ってテキスト化されたものに過ぎない。

まとめると、RS256は秘密鍵と公開鍵を使う非対称暗号方式である。秘密鍵は署名にのみ使われ、公開鍵は検証にのみ使われるため、公開鍵が漏洩しても偽のトークンは作成できない。この仕組みは、認証サーバーとAPIサーバーが分かれているマイクロサービスアーキテクチャにおいて特に有効で、セキュリティと拡張性を両立させる。一方、HS256は同じ秘密鍵で署名と検証を行うため、よりシンプルな構成や、単一サービスでの利用に適している。どちらの方式を選ぶかは、システムの要件とセキュリティリスクを考慮して決定すべきだ。RS256の背後にあるのは、素因数分解の困難性を利用したRSA暗号の堅牢な数学原理であり、この理解が安全な認証システムの構築に不可欠となる。

関連コンテンツ

関連IT用語

関連ITニュース