🔑

公開鍵や秘密鍵の暗号技術を理解せずに、OpenID Connectの実装をしている人へ

2023/05/05に公開
1

最初に

この記事では、OpenID Connectの実装時に悩んだことや、考えたこと、調べたことについて書いてみる。OpenID Connectを実装するにあたって、認可フローやPKCE対策など色々調べたが、今回はその中でも秘密鍵や公開鍵、などの暗号化、復号について書いてみる

秘密鍵、公開鍵とは?

ほとんどの人が調べた結果、下記という文言をみて理解した気になってしまう。

確かにこの表現は間違ってはいないし、説明するとしたら、こうなってしまう。

ただ、この前に前提として押さえておきたいのが、暗号には暗号アルゴリズムが存在し、そのアルゴリズムの中で秘密鍵と、公開鍵が使われているということ。

そのアルゴリズムでよく聞くのが、共通鍵暗号方式、公開鍵暗号方式、(ハイブリッド暗号方式)の3つ

共有鍵暗号方式

1つの鍵を使って暗号化、復号する仕組み

公開鍵暗号方式

公開鍵と秘密鍵の2種類を使って暗号化、復号する仕組み

ここでやっと公開鍵と、秘密鍵が出てくる。つまり、秘密鍵と公開鍵の2つが使われるのは、公開鍵暗号方式と言うことになる。

そしてこの公開鍵暗号方式が、OpenID Connectに使われているということ。

ちなみに使われてる箇所は、トークンエンドポイントから、idトークンを取得し、そのidトークンの署名を検証する際に、JWKSエンドポイントを叩き、公開鍵を取得し、署名を検証してるこの部分。

つまり、この動作をもう少し暗号的に説明すると、トークンエンドポイントから取得したidトークンは秘密鍵を使って暗号化されており、JWKSエンドポイントで取得した公開鍵を使って、復号してるとも捉えることもできる

OpenID Connect周りの実装を進めてると、暗号周りでわからなくなってくるのが、RSA256、RS256のこの2つ同じものかと思うが、実は全くこのとなるものとなる。同じような文字列なので、すごく迷うが、1つが、公開鍵暗号方式のアルゴリズム(RSA256、HSA256)で、もう片方(RS256)が署名のアルゴリズムになる。

やっと秘密鍵や公開鍵について理解できたと思ったら、またしても新たに暗号アルゴリズムが出てきて、わからなくなる。

公開鍵暗号方式のアルゴリズム

公開鍵暗号方式で使われるアルゴリズムは複数あるみたいだが、そのうちの1つがRSA256だということ。他には、DH鍵共有、楕円曲暗号などもあるみたい。

RSA暗号は素因数分解の難しさを利用した暗号アルゴリズムと覚えておけばよさそう。

ちなみにRSA暗号の秘密鍵は下記で作成できる

openssl genrsa -out private_key.pem 2048

そして下記で公開鍵も作成できる

openssl rsa -in 秘密鍵ファイル名 -pubout -out 公開鍵ファイル名

署名のアルゴリズム

JWTの署名のアルゴリズムにはRS256とHS256の2種類がある。

RS256は、JWTの署名アルゴリズムの1つで、RSA暗号(公開鍵暗号方式のアルゴリズム)を使用して署名を生成する方式。

ここでさっき、公開鍵暗号方式で話していた内容と繋がる。

つまり、公開鍵暗号方式(RSA256)の秘密鍵を使ってidトークンの署名(RS256)生成し、その署名を検証するために公開鍵をJWKSエンドポイントから取得するということになる。

最後に

色々書いてしまったが、基本情報技術者で学ぶことがほとんどらしい。基本情報技術者を学ばずに認証周りを実装しようとすると混乱すると思うので、その辺の知識はつけておいた方が良いかもしれない

Discussion

ritouritou

IDTokenのフォーマットであるJWTに関しては、

  • 共有鍵暗号方式の鍵を用いた署名生成、検証(HMAC系アルゴリズム)
  • 公開鍵暗号方式の秘密鍵を用いた署名生成、公開鍵を用いた検証
  • 公開鍵暗号方式の公開鍵を用いたコンテンツの暗号化と秘密鍵を用いた復号、それと上記署名生成検証機能の組み合わせ(JWE)

といったいろいろなことができる設計になっています。
デジタル署名の生成/検証と暗号化/復号のコンテキストは分けて表現すると誤解を招きにくくなるかもしれません。

OpenID Connect周りの実装を進めてると、暗号周りでわからなくなってくるのが、RSA256、RS256のこの2つ同じものかと思うが、実は全くこのとなるものとなる。同じような文字列なので、すごく迷うが、1つが、公開鍵暗号方式のアルゴリズム(RSA256、HSA256)で、もう片方(RS256)が署名のアルゴリズムになる。

RS256はあくまでJWTの世界の署名アルゴリズムの定義であり、RFC 7518に "RSASSA-PKCS1-v1_5 using SHA-256" とあるように、ハッシュ関数と公開鍵暗号方式の種類の組み合わせとなっています。
共有鍵暗号方式については、HMAC using SHA-256を利用するアルゴリズムは HS256 として定義されています。

細かいところではありますが、別物というよりは関係性を意識した上で整理されると理解が深まりそうです。