動機
professional SSL/TLSを読んで、今後はなるべくECDSA鍵を使っていこうと思った。
先行記事のGitHubでEd25519鍵をつかうも非常に面白いのでぜひ。
ECDSAとは?
ECDSA(Elliptic Curve Digital Signature Algorithm)は楕円曲線暗号を使った公開鍵のアルゴリズムで、RSAよりも短い鍵長で安全性を担保できる。
短いということは、TLSなどで利用する場合は高速に鍵交換が行えるということである。
(後で示すが、256bitのECDSA鍵は、2,048bitのRSA鍵より安全かつ2倍早い)
ただし古いブラウザでは対応していない場合があることに注意。
参考(ちょっと古め): ウェブブラウザにおけるTLS/SSLの対応状況の変化
とはいえNISTによると、2031年以降、RSA 2,048bitをはじめ強度の低いアルゴリズムはほとんどが使用禁止扱いになる。
ECDSAがスタンダードになるのは時間の問題。
GitHubのSSH keysで使う方法
鍵作って登録するだけだが、若干ハマりどころがある。
まず確実にECDSA鍵を作るため、openssl
コマンドのバージョンを最新にする。
(macの2018までのデフォだとTLSの証明書とか作れないためupgradeを勧める)
更新前(下記はmacOS Mojave v10.14.2 MacBook Pro (2018)
の結果)
$which openssl
/usr/bin/openssl
$openssl version
LibreSSL 2.6.5
更新
$ brew upgrade openssl
$ brew link openssl --force
更新後
$which openssl
/usr/local/bin/openssl
# brewfileなどで入れるとシンボリックリンクが自動で貼られなかったので手動で貼る
$ln -s /usr/local/Cellar/openssl/1.0.2q/bin/openssl /usr/local/bin/openssl
# Note: ttyのsessionも再接続させた方が良いことが多い
$openssl version
OpenSSL 1.0.2q 20 Nov 2018
鍵を作り、公開鍵の中身をGitHubの設定のSSH keysに登録。
$ssh-keygen -t ecdsa -b 256 -C "your_email@example.com"
Enter file in which to save the key (/Users/me/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
$cat .ssh/id_ecdsa.pub | pbcopy
結果をGitHubに登録したら疎通確認。
$ssh -T -i ~/.ssh/id_ecdsa git@github.com
ECDSAに対応していない環境が多い場合などはRSAと併用すると思う。
そうした事情で~/.ssh/config
でIdentityFile ~/.ssh/id_rsa
などと記載している場合もあると思う。
そしたらgit cloneでRSA鍵を使われてしまうが、git2.3以降であればGIT_SSH_COMMAND
という環境変数を使えるので、GitHubに対してだけECDSA鍵を使うという手もある。
$vi ~/.bashrc
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ecdsa"
詳細データ
下表より、256bitのECDSA鍵の強度は128(bit)で、2,048bitのRSA鍵の強度112(bit)より安全である。
参考: NIST Special Publication 800-57(2012/07)
また鍵交換の速度については、256bitのECDSA鍵は2,048bitのRSA鍵より2倍高速となる。
参考: professional SSL/TLS 第9章より
=> 1,000回のTLSハンドシェイクにおけるCPU使用時間のベンチマーク
その他(雑記)
量子コンピュータ時代の暗号化対策としては、鍵長を伸ばす等よりも、そもそも素数に頼らない新たな方法を模索しているのだと小耳に挟んだ。
例えば、高次元の連立方程式にするなど。面白い。