Unity C#でJWT生成しようとしたら署名部分の実装理解が大変そうで撤退

UnityでGoogle Spreadsheetのデータにアクセスするのに、Google Client Libraryを使った際の裏話です。

mich0w0h.hatenablog.com

UnityでVisual Studioを使わずにNugetパッケージを導入するのちょっと面倒そうだなーと思った過去の私(詳しくは上の記事参照)は、パッケージを使わずに自分で実装すればいいじゃんと思いました。

Googleのサービスアカウント方式でアクセストークンを入手するフローはなんとなくわかっていましたし、実際以下のようなNodeで実装した記事とかも見つけて、これをUnity C#に持ってくればいけるっしょ、と。

christina04.hatenablog.com

で、実際やってみて、ほぼほぼ実装できそうだったのですが、トークンリクエストで使用するJWT生成の最後の最後、署名部分でちょっとくじけました。

RSA暗号使っての署名はGCPから落とした秘密鍵を暗号化モジュールに読み込ませればできるっしょと思っていたのですが、C#だと自分でmodulus等の各パラメータをPEMから抽出して設定しなければならないみたいでした。自分が調べた範囲に限定されるので、もしかしたら他の手もあるかもです。

具体的な実装方法はは以下の記事等で紹介されています。 qiita.com

記事を読んでみるとわかるのですが、各パラメータを抽出するにはASN.1という規則で書かれたデータをバイナリにしたやつを読み取っていくことになります。ASN.1をバイナリ変換するフォーマットはDER (Distinguished Encoding Rule)というものが使われているそうです。うん、このバイナリ読み解き方が全然わからない。私はもっと軽い気持ちでこの実装に臨んでいたんですよね。

かと言って、なんとなくわかる範囲内で実装したかったので、コードのコピペは憚られます。

結局冒頭に貼った記事に着地し、思ったよりもUnityへの.NET Google Client Library導入が簡単だったため、自前実装作戦は撤退となりました。

ちなみに、後日気になって調べたところ、以下の記事がASN.1やDERについての説明としてわかりやすかったです。読み物としてもおもしろいです。「全然わからない」からは抜け出せました。 bearmini.hatenablog.com

今回は実装自体は撤退しましたが、今まではただ"-BEGIN PRIVATE KEY-"だけを認識していた秘密鍵の中身への解像度が上がりましたし、RSAの各パラメータについてももう少ししっかり理解したいなと思うなど、暗号について以前より興味を持つ良いきっかけになったかなと思います。