リモートアクセスにはセキュリティが大切

リモートアクセス(ネットワークを経由した他のコンピュータへのアクセス)する上で最も大切なことが、セキュリティを確保することです

家庭内での利用でも社内での利用でも、セキュリティを軽視するわけにはいきません。 ネットワークが盗聴されていても情報が漏れることのないような仕組みを構築することが重要です。

セキュリティを確保するために利用されるのが暗号化であり、暗号化は3つの柱から成り立っています。

この記事では "暗号化を支える3つの柱" についての概要を説明します。 あまり難しい話にはなりません。 あくまでも概要です。

  
SSHの利用には暗号化の基礎的な知識が必要になります。
  

暗号化を支える3つの柱

暗号化を支える3つの柱とは、

  1. 共通鍵暗号
  2. 公開鍵暗号
  3. 一方向暗号

の3つです。 それぞれについての概要を以下で解説します。

  
一方向暗号はハッシュ関数とも呼ばれます。

一方向暗号とは

まずは一方向暗号から解説します。 一方向暗号とは、名前が示す通りに "一方通行のデータ変換" のことを指します。 つまり、元に戻すことはできません

例えば、

秘密の言葉

というテキストを一方向暗号で変換すると、

dd1bb2f76ba707e4a4eb8efdbdf0b605767bf5f5d781216bae8f466ed8ef5562

というテキストに変換されたとします。

この変換後のテキストである、

dd1bb2f76ba707e4a4eb8efdbdf0b605767bf5f5d781216bae8f466ed8ef5562

は、どうやっても元のテキストである、

秘密の言葉

に戻せません。

つまり、"一方向暗号" という名前ですが、暗号化そのものに利用されるものではありません

なお、一方向暗号で変換された結果のテキストのことを "ハッシュ値" と呼びます。

  
本ウェブサイトでも以降は "ハッシュ値" と表記します。

一方向暗号が何の役に立つのか

どうやっても元のテキストには戻せない "一方向暗号" ですが、そんなモノが何の役に立つのでしょうか。

一方向暗号が活用されるのは、改ざん防止とパスワードの保存です


まずは、改ざん防止の例から見てみましょう。 ここではLinux MintのISOイメージファイルが改ざんされていないことを確認する手順を紹介します。

 

上図のようにLinux Mintのダウンロードページには、[sha256sum.txt]というボタンがあります。 このボタンを押すと、以下のようにLinux MintのISOイメージファイルを一方向暗号にかけたハッシュ値が表示されます。

759c9b5a2ad26eb9844b24f7da1696c705ff5fe07924a749f385f435176c2306 *linuxmint-22.2-cinnamon-64bit.iso
21f5a5f7be652c60b20ba7996328098b14e979b1ef8bf7f6c9d4a2a579504a65 *linuxmint-22.2-mate-64bit.iso
dea13e523dca28e3aa48d90167a6368c63e1b3251492115417fdbf648551558f *linuxmint-22.2-xfce-64bit.iso

ダウンロードしたISOイメージファイルをPC上で一方向暗号にかけ、その結果を上記のハッシュ値と比較することで改ざんされていないことを確認することができます。

以下のようにウェブサイトに掲載されているハッシュ値と一致すれば、改ざんはされていません。

taro@myhostname:~$ sha256sum linuxmint-22.2-mate-64bit.iso
21f5a5f7be652c60b20ba7996328098b14e979b1ef8bf7f6c9d4a2a579504a65 linuxmint-22.2-mate-64bit.iso
taro@myhostname:~$
  
改ざんされていれば異なるハッシュ値になります。

一方向暗号のもう1つの使い道がパスワードの保存です。 LinuxやWindowsにログインしたり、GoogleやYahoo!のサービスを利用する際に入力するパスワードのことです。

これらのパスワードは、入力されたそのままで保存されることはありません。 一方向暗号で変換されたハッシュ値が保存されます

例えばログインパスワードを、

mypassword

に設定すると、

ddec437eeb1da25a146a24c432d1165bc646daa7fecc6aa14c636265c83caa14

というハッシュ値が保存されます。

ログインの際には入力したパスワードからハッシュ値が計算され、

ddec437eeb1da25a146a24c432d1165bc646daa7fecc6aa14c636265c83caa14

と一致するかどうかで成否が決定されます。 一致すればログインすることができ、一致しなければ "パスワードが間違っています" となります。

このようにログインパスワードそのものである、

mypassword

を保存しなくてもパスワードを知っているかどうかを判断することができるのです


短いパスワードや辞書に載っている単語のパスワードがダメだと言われる理由


パスワードの設定に関してやってはいけない注意点として、

  1. 短いパスワード
  2. 辞書に載っている単語のパスワード

の2点がよく挙げられます。 これらはパスワードの情報が漏洩した場合を想定してのことです。

  
パスワードの使いまわしもダメです。

なお、漏洩するのはハッシュ値である、

ddec437eeb1da25a146a24c432d1165bc646daa7fecc6aa14c636265c83caa14

ですが、それでもセキュリティ上の問題が発生します。 なぜなら、パスワードとハッシュ値の対応表が地下で出回っているからです。

漏洩したハッシュ値である、

ddec437eeb1da25a146a24c432d1165bc646daa7fecc6aa14c636265c83caa14

を、変換前のパスワードの、

mypassword

に戻すことはどうやってもできません

ただし、

0

というテキストを一方向暗号で変換したら、

9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa

というハッシュ値になる、ということはわかります。

つまり、

0
1
2
3
4

という具合にテキストを順に一方向暗号で変換して結果のハッシュ値を蓄積していけば、パスワードとハッシュ値の対応表が完成する、というわけです。 なお、その対応表は "レインボーテーブル" と呼ばれます。

レインボーテーブルに、

ddec437eeb1da25a146a24c432d1165bc646daa7fecc6aa14c636265c83caa14

というハッシュ値が収録されていれば、パスワードは一発でバレてしまいます。 短いパスワードほど、すでにレインボーテーブルに収録されている可能性は高くなります

また、レインボーテーブルには辞書に掲載されている単語の対応も収録されています。 例えば、

action
adventure
apple

などのハッシュ値が収録されているのです。

英語圏の辞書だけではありません。 世界各国の地名・人名などを英語表記したものも掲載されていると聞きます。 つまり、日本語の単語だから安心、ということはありません

共通鍵暗号とは

続いて解説するのは "共通鍵暗号" と呼ばれる暗号化方式です。 共通鍵暗号は一方向暗号とは異なり、暗号化したものを元に戻すことができます

  
元に戻すことを "復号" といいます("復号化" ではありません)。

共通鍵暗号では、同じパスフレーズが暗号化・復号の両方に利用されます。 つまりパスフレーズが "鍵" であり、暗号化と復号で同じ鍵を使うため "共通鍵暗号" と呼ばれます。

  
"パスフレーズ" とはパスワードの形態の1つです。 空白を含めてもいいパスワードのことをパスフレーズと呼びます。

共通鍵暗号ではビット演算によって暗号化・復号が行われます。 入力されたパスフレーズをビット列に変換し、そのビット列で排他的論理和(XOR)を行うことで暗号化されます。

  
コンピュータは 0(ゼロ) と 1 の世界だとよく表現されます。 0 または 1 の1桁のことを "ビット" と呼びます。

暗号化された結果に再度同じビット列で排他的論理和を行うことで復号を行うことができます。

演算 結果
0 XOR 0 → 0
0 XOR 1 → 1
1 XOR 0 → 1
1 XOR 1 → 0

上記のように排他的論理和は論理和に近いですが、1 と 1 を排他的論理和すると 0 になるという点が異なります。

  
排他的論理和の結果に、再度同じビット列で排他的論理和を行うと元に戻るという特性を利用した暗号化技術です。

例えば、入力データが、

  • (A) 01001101

で、パスフレーズから求めたビット列が、

  • (B) 01010101

の場合、暗号化後のデータは、

  • (C) 00011000

となります。

(A) 0 1 0 0 1 1 0 1
XOR
(B) 0 1 0 1 0 1 0 1
(C) 0 0 0 1 1 0 0 0

暗号化後のビット列である、

  • (C) 00011000

に、再度、パスフレーズから求めたビット列である、

  • (B) 01010101

を使用して、排他的論理和の演算を行うと、

  • (A) 01001101

に戻ります。

(C) 0 0 0 1 1 0 0 0
XOR
(B) 0 1 0 1 0 1 0 1
(A) 0 1 0 0 1 1 0 1
  
共通鍵暗号の欠点は、鍵(パスフレーズ)を他人に知られてはいけないという点です。 鍵が知られてしまうとその鍵で暗号化した全ての情報が解読されてしまうためです。 つまり、暗号化されていない経路には共通鍵の情報は流せないということになります。
  
実際の共通鍵暗号の処理はもっと複雑です。 ビットを入れ替える転置などの処理も行われます。

公開鍵暗号による暗号化とは

最後に紹介するのが "公開鍵暗号" と呼ばれる暗号化方式です。 こちらも共通鍵暗号と同じく、暗号化したものを元に戻すことができます

公開鍵暗号はメールの暗号化やHTTPSで利用される暗号方式で、インターネット等の盗聴の危険性のある経路で情報を送受信する際に利用されます。 身近なところでは、インターネット上のショッピングサイトでクレジットカード番号を入力する際に使用されます。

公開鍵暗号では、秘密鍵と公開鍵の鍵ペアによって暗号化・復号が行われます。 秘密鍵は2つの素数を含み、公開鍵は秘密鍵の2つの素数をかけた値を持ちます。

秘密鍵 素数1, 素数2
公開鍵 素数1と素数2を掛けた値

共通鍵暗号ではパスフレーズが "鍵" でしたが、公開鍵暗号では "素数" が記録された2つのファイルが "鍵" となります。 秘密鍵は復号に利用され、公開鍵は暗号化に利用されます。

秘密鍵 ・復号できる
公開鍵 ・暗号化できる
・復号はできない

なお、秘密鍵はネットワーク上には絶対に流してはいけません。 一方、公開鍵は名前が示す通りネットワーク上を流れても問題ありませんし、実際にネットワークを流れていきます。

秘密鍵 ・ネットワーク上を流してはならない
・他人に渡してはならない
公開鍵 ・ネットワーク上を流れる
・必ず相手に渡る

ネットワーク上には秘密鍵は決して流さず、通信相手には公開鍵のみを通知します

通信相手は公開鍵を使って暗号化を行い、データを送信します。 受け取った側は秘密鍵に含まれる2つの素数から復号します。

復号には秘密鍵に含まれている2つの素数が必要なため公開鍵が盗聴されても機密は保たれます。


例えば、秘密鍵の素数(pとq)が5と11だとします。 この場合、公開鍵の素数(n)はpとqを掛けた値である55になります。

秘密鍵 5, 11
公開鍵 55

この場合、2つの素数(5と11)のそれぞれから-1した値の最小公倍数(L)を求めます。

  1. L = 20 (4と10の最小公倍数)

次に、Lより小さくLと互いに素(最大公約数が1)の数(e)を決定します。

  1. e = 3

求めたeの値から公開鍵は以下になります。

  1. 公開鍵(n, e) = 55, 3

上の公開鍵はインターネットを経由して通信相手に渡されます。 通信相手は、

  1. (平文^e) % n

で暗号化を行います。

  
平文とは暗号化前の素のデータのことです。
  
式中の^はべき乗を、%は剰余を表しています。

例えば、8 7 4 を暗号化すると、

  1. (8^3) % 55 → 17
  2. (7^3) % 55 → 13
  3. (4^3) % 55 → 9

となります。 これを復号するには、まず、eを掛けてLで割った余りが1となる、1より大きくLより小さい数(d)を求めます。

  1. d = 7

求めたdから、

  1. (暗号文^d) % n

で復号します。 暗号化された 17 13 9 を復号すると、

  1. (17^7) % 55 → 8
  2. (13^7) % 55 → 7
  3. (9^7) % 55 → 4

となり、元に戻すことができます。

  
公開鍵暗号の欠点は、公開鍵に含まれている素数を素因数分解されると暗号を解読されてしまう点です。 今回の例では、55を5と11に素因数分解されると、dを求めることができ、暗号を解読されてしまいます。
  
実際の公開鍵暗号の処理はもっと複雑です。 また、素数も大きな数値が利用されます。 筆者が利用している鍵は、2進数で4096桁(つまり4096ビット)です。 10進数で表すと約1233桁になりますので、素因数分解は困難です。
  

まとめ

暗号化を支えているのは、

  1. 共通鍵暗号
  2. 公開鍵暗号
  3. 一方向暗号

の3つです。

共通鍵暗号では、パスフレーズをビット列に変換した値で排他的論理和(XOR)による演算が行われます。 暗号化・復号ともに同じパスフレーズが鍵として利用されます。

公開鍵暗号では、秘密鍵と公開鍵のペアが利用されます。 秘密鍵は2つの素数を持っており、復号に利用されます。 公開鍵は秘密鍵の2つの素数を掛けた値を持っており、暗号化に利用されます。 公開鍵は文字通り公開して利用されますが、秘密鍵は絶対にネットワークに流してはいけません。

一方向暗号は文字通りの一方通行の変換であり、元に戻すことはできません。 ですが、改ざん防止とパスワードの保存という大切な役割を担っています。