見出し画像

CS_公開鍵認証について #336日目

コンピューターサイエンスについて学び始めました。
基本的なビットやバイトの話も書きたいと思っていたのですが、その前に面白いことを学んだのでアウトプットしておきます。

リモートでコンピューターにアクセスするためのプロトコルである「SSH」に関してです。

AWSやSnowflakeなどのクラウドにアクセスする時によく使うものですが、RSAやED25519等いくつか種類があったり、そもそも暗号化というものがどうやって行われているのかよく分からなかったり、イマイチ掴めていませんでした。

それらについて整理したいと思います。

SSHとは

Secure Shellの略で、リモートコンピューターと通信するためのプロトコルです。認証部分を含めてネットワーク上の通信が全て暗号化されるため、安全に通信することができます。


公開鍵認証とは

公開鍵と秘密鍵の対(key pair)を用いて、遠隔接続要求を受けたサーバーが要求元の端末(ユーザー)に対して接続可否を判断するものです。SSHの認証部分ではこの公開鍵認証が使われています。

基本的に、秘密鍵はユーザー手元の端末で秘匿し、公開鍵は遠隔接続したいリモートホストに登録しておきます。リモートホスト側に接続要求があった場合、予め登録されている公開鍵を元に、接続を許可する端末かどうか判断している形です。

GitHubからgit cloneする際なども、GitHub上に公開鍵を登録しますね。


公開鍵での暗号化とは

ではこの公開鍵と秘密鍵を使った暗号化とは何なのでしょう。一言でいうと、解読困難な数式が公開鍵で、その数式を解読するための答えが秘密鍵です。

つまりは数学的な解読困難性を暗号と呼んでいることになります。

例えば公開鍵の一例であるDSAという方式では「離散対数問題の困難性」を暗号化に用いています。

離散対数問題(DLP:Discrete Logarithm Problem)とは「素数pと自然数gが与えられたとき、ある自然数xに対してgのx乗をpで割った余りyを求めるのは容易だが、yからxを求めるのは困難である」という問題で、DSAではpやgなどからyを含む公開鍵(複数の値の組として表される)を生成し、xを秘密鍵とする。

https://e-words.jp/w/DSA.html

公開鍵認証の種類

公開鍵認証はRSAやED25519などいくつかありますが、それらは何を使って解読困難にしているのかという、採用している数式の違いです。

RSA: 
大きな素数の因数分解が困難であることを利用しています。歴史ある手法でさまざまな言語でライブラリが用意されています。
セキュリティ確保のために鍵長を長くする必要があるためパフォーマンスが良いわけではありません。鍵長は2048bitが標準とされていますが、弊社では倍の4096bitを採用しています。

DSA:
離散対数問題の困難性を利用しています。ただしこちらは暗号が突破されうる弱点が見つかったため、現在ではデフォルトで無効化されています。

EdDSA:
DSAの改良版で、セキュリティ上の弱点を克服したものになります。専門用語で言うと、楕円曲線上の点に対する離散対数問題を利用したものです。まだ新しく普及度は低いですが、高セキュリティで鍵長も短く、この方式の一種である「Ed25519」が現在はGitHubでも推奨されています。


公開鍵を作成するコマンド

以下のコマンドで作成可能です。

ssh-keygen -t (署名方式) -b (鍵のbit数) -C "account@example.com"

例えばRSAならば以下のように作成します。

ssh-keygen -t rsa -b 4096 -C "account@example.com"


ここまでお読みいただきありがとうございました!


参考


この記事が気に入ったらサポートをしてみませんか?