いつのまにかSSH鍵生成時のデファクトスタンダードが変わっていた
気付いた発端
実は前回の記事「Vertex AI WorkbenchとGitHubの繋ぎ込み」を書いている時に、GitHubのドキュメント「新しい SSH キーを生成して ssh-agent に追加する」を参照していたら、気になる記載が…
ssh-keygen -t rsa
なんてもう皆が何でも無いときにでも打ってしまうようなフレーズだと思っていたらいつのまにか ed25519
なるものが推奨されていたという衝撃。
調べて見るとここ数年はRSAよりEd25519のほうが強固だからそっちを使おう、みたいな話がたくさんヒットしてきて完全に乗り遅れていたことがバレてしまいました…
せっかくなので、本記事では rsa
と Ed25519
で何が違うかについて調べながら書いてみます。
ssh鍵生成の方式
とりあえずマニュアルで全方式を確認する
とりあえず黙って man
コマンドでマニュアルを参照します。
man ssh-keygen
鍵の方式の -t
オプションのマニュアルを参照します
-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa Specifies the type of key to create. The possible values are “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk”, or “rsa”. This flag may also be used to specify the desired signature type when signing certificates using an RSA CA key. The available RSA signature variants are “ssh-rsa” (SHA1 signatures, not recommended), “rsa-sha2-256”, and “rsa-sha2-512” (the default).
というわけで、 dsa
ecdsa
ecdsa-sk
ed25519
ed25519-sk
rsa
の6つのオプションがあります。
-sk
はSecurity Keyのことで、物理的な FIDO/U2F
がサポートされたOpenSSH 8.2で登場しているようです。これだけでもう勉強になりました。いつかYubiKeyに鍵を保存してみたいですね。
(参考: OpenSSH 8.2のリリース文書)
ということで、鍵の方式としては実質的に
-
dsa
-
ecdsa
-
ed25519
-
rsa
の4オプションが標準で用意されていることになります。
DSA
DSAはDigital Sginature Algorithmの略で、最もレガシーと言えるのではないでしょうか。
速度面とセキュリティ面から非推奨とされていることが多く、実際、GitHubでは2021年9月にサポート打ち切りとされています。(参考: GitHubのImproving Git protocol security on GitHubの記事)
RSA
言わずと知れた長らくのデファクトスタンダードであり、多くの人が息を吸うように指定するであろう方式です。
セキュアにするためには「キーサイズ」を大きくする必要がありますが、そうすると計算に時間が掛かる…というトレードオフが当たり前ながらあったり、実装におけるスキームによっては脆弱性が見つけられたりで完璧ではない…という認識です。
そこで登場したのが以下の楕円曲線ベースのアルゴリズムになります。
ECDSA
EC(Elliptic Curve)=楕円曲線を使うことにより効率的に処理できるアルゴリズムとなります。詳しい解説は楕円曲線DSAのWikipediaを参照されると良いかと思いますが、なかでもポイントは、DSAで1024bitの公開鍵が必要なセキュリティレベルをECDSAなら160bitで足るというところかと思います。
ということで、署名生成/検証においても効率的に行うことが出来る…ということになります。
Ed25519
Ed25519は同様に楕円曲線を使ったアルゴリズムですが、より高速かつセキュア…という認識です。
セキュアという面では、ECDSAが署名生成のたびに乱数を必要とするのに対し、Ed25519は乱数を必要としないことがポイントの一つのようです。実装もシンプルです。
名前の構成ですが…Edはエドワーズ曲線(Edwards-curve)からきており、25519はCurve25519からきています。(参考: Curve25591のWikipedia)
さらにいうと、25519って何やねん、というところで、これは有限体 F_p
の素数p= 2^255-19
で定義されるモンゴメリ曲線…ということです。 2^255
の255と、 -19
の19からとって、25519ということですね… 覚えやすい!!
ちなみにCurve448というものを用いたEd448という方式もありますが、こちらは素数として 2^448-2^224-1
を選択しているものらしいです…
とりあえず完全理解が難しい小市民としては、Ed25519という文字列を覚えておけば問題なさそうです。
まとめ
今回はSSHの鍵方式について、ちょっと気になったので調べた結果をまとめてみました。
いざ調べてみると知らないことだらけですね。色々な方がわかりやすく解説しているので、興味を持った方はぜひ調べてみるとよいかと思います。
普段何気なく -t rsa
で済ませていましたが、調べると非常に奥の深い世界で時間が溶けていく感じがしました。
こういったアルゴリズムの世界は世の中で一番数学が役に立っている場所なんじゃないか…と思ったりします。
老害認定されないよう、定期的に情報のアップデートを行っていこうと強く思わされました。
Ed25519
ももう覚えたので忘れません!
皆さんも頑張って覚えましょう。(もう常識かもしれませんが…)