公開鍵認証の暗号方式

2017年6月16日

サイトのドメイン認証やサーバーへのSSH接続の際に利用する公開鍵認証の暗号方式について。

opensslやssh-keygenを使って鍵ペアを作る際に、暗号方式を指定することができますが、どんなオプションが適切なのかよくわからなかったので調べてみました。

結論としては現時点ではRSA方式の2048ビットでよさそうです。

公開鍵認証

インターネット通信はデータがどんな経路を流れているかわからないので、通信相手が適切かどうかは不明です。

パスワードを使ったユーザー認証は今時安全ではないということで、公開鍵と秘密鍵のペアを使った公開鍵認証が主流です。更に言えば通信相手の確認はクライアント側のユーザーだけでなく、接続先のサーバーそのもののチェックも欠かせない。こういうホスト認証にも公開鍵認証が使われます。

公開鍵と秘密鍵は必ずひと組のペアになっていて、一方の鍵で暗号化したデータは他方の鍵でしか復号化できないというもの。

公開鍵で暗号化された内容は秘密鍵を持っている人しか復号化できないので、復号化できるということは秘密鍵を持ったただ一人ということで本人認証ができるということ。あるいは公開鍵で復号化できる暗号を送ってきたということは秘密鍵を持ったただ一人ということで、これまた本人認証ができるということ。

RSAもDSAも暗号化の手法は異なるものの、上記のような公開鍵認証という振る舞いは同じです。

このような振る舞いによって、公開鍵の持ち主が秘密鍵の持ち主を正規の通信相手として認証します。

RSA暗号方式

RSA暗号はMITのRivest、Shamir、Adlemanの3人が発明したもので、素因数分解が肝となる暗号方式です。

この暗号は素数の積から元の素数を逆算できれば破られますが、使用する素数が非常に大きな数の場合現実的な時間で逆算できないということが安全性の根拠となっています。

2009年末にはビット長768までは解読されていますが、ビット長2048ならしばらくの間は安全っぽい。

DSA暗号方式

DSAはアメリカ国家安全保証局が開発したDigital Signature Algorithmで、離散対数問題を安全性の根拠としています。

もともとはRSAの特許回避のために生まれたもので、SSH2接続のデフォルトはDSA方式でしたが特許有効期限切れによりSSH2でもRSAが使用されるようになりました。

こちらのビット長は2048が推奨されていますがssh-keygenでは1024ビット長までしか扱えないということで、もはや使用しないというのが一般的な模様。

そこで登場したのがDSAの変種のECDSA。こちらはポストRSAとも言われ…。

何を使うのがいいのか?

「どれを使えばいいんだぁ!」と悩んでいたら、国家研究開発法人情報通信研究機構NICTの資料で暗号強度別の分類というものを見つけました。おおもとは米国標準技術研究所NISTの資料みたいですが。2030年までは暗号強度112ビットに相当するビット長2048のRSAでいいらしい。

利用時期暗号強度RSAビット長DSAビット長ECDSAビット長
2011年から2030年112ビット2048ビット2048ビット224ビット
2031年以降128ビット3072ビット3072ビット256ビット

一方で現在の利用環境をまとめてみる。

クライアント/サーバーSSHバージョン
Vultr VPS w/FreeBSD 12.0OpenSSH_7.8p1
Time4VPS w/CentOS 7.6OpenSSH_7.4p1
MacBook Pro w/macOS High SierraOpenSSH_7.8p1
MacBook Air w/macOS YosemiteOpenSSH_7.9p1
ASUS Chromebook C101PA w/Debian9.9OpenSSH_7.4p1
Lenovo Thinkpad E590 w/Debian9.9 on Windows10OpenSSH_7.4p1

いずれもECDSAやED25519をサポートしています。

ssh-keygenのパラメータ

今回は現時点で最も暗号強度の強いED25519で鍵ペアを作ります。ビット長は256固定なので指定する必要はありません。

$ ssh-keygen -t ed25519 -C "comment"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/hoge/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/hoge/.ssh/id_ed25519.
Your public key has been saved in /Users/hoge/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:f*****************************************k comment
The key's randomart image is:
+--[ED25519 256]--+
|      ..+*+++. B.|
|       oo..oo @ +|
〜中略〜
|          +  o.o.|
|         .....o.=|
+----[SHA256]-----+

ssh-keygenをパラメータなしで起動すると、デフォルト値の2048ビットRSAがコメントなしで生成されます。また暗号方式にECDSAを指定する場合は暗号方式指定の-tにecdsa、ビット長指定の-bに256を指定して鍵ペアを作ります。

ちなみに作成された鍵の暗号強度を確認するときは-lオプションを使います。

$ ssh-keygen -l -f ~/.ssh/id_ed25519.pub
256 SHA256:f*****************************************k comment (ED25519)

opensslのパラメータ

いまいちssh-keygenとの使い分けがよくわかっていませんがssh-keygenがSSH用の鍵ペア作成コマンドで、opensslがHTTPS通信SSL用の秘密鍵生成コマンドです。

Generating RSA private key, 2048 bit long modulus
........+++++
.............+++++
e is 65537 (0x010001)
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAnzT0Nss9FOe41TvTbpXOEECu46iLGUeQLR0vulU1rr+37l9n
1fA83TvIf22ghr8cX1vW+3e2dqYkaun989GuiHWJGjWAIG7N+OM9luyJ9QeSFiAB
〜中略〜
JkBt3McV0X3QxiXNATO/hz+4rCalXyJzY/Ai5spYUIBVNrWoyMhSQVKtI3E+L05i
8kn1kCeBupdskqgVKSQRRvQiAgCABzilV0PH/Me6nmp6GPsm/2×9
-----END RSA PRIVATE KEY-----

ここではgenrsaで暗号方式を、2048でビット長を指定しています。