安全な通信を考える(共通鍵暗号/公開鍵暗号)

IPAが実施する情報処理資格の情報処理安全確保支援士やネットワークスペシャリスト試験。僕も受験しました。試験勉強しているなかで電子証明書とかPKIなど暗記してしまえばいいのかもしれないけれど、そもそも「なぜそんなことが必要なのか?」を理解するほうが頭に入ってきますので(僕の感覚でだけれど)、その考え方をまとめてみようと思います。実は、勉強していたときは「なるほど」と思い納得していたのだけれど時間が立つに連れ忘れてしまい、どこかでまとめておきたかったのでこのブログを機にまとめることにしました。3回にわけてまとめます。物語風です。

1回目:安全な通信を考える(共通鍵暗号/公開鍵暗号)
2回目:安全な通信を考える(ハッシュ関数/電子署名)
3回目:安全な通信を考える(電子証明書/PKI)

今回は、その1回目です。

■共通鍵暗号

安全な通信を行いたい場合、他の人が読めないように暗号化を行えば安心です。その暗号化の方式としてまず考え出されたのが「共通鍵暗号方式」です。これは共通鍵という鍵を使い暗号化と復号を行うものです。この共通鍵はAさん(送信者)とBさん(受信者)の双方が同じものを持っている必要があります。通信手順は以下となります。

  1. Aさんが共通鍵で送りたい情報を暗号化します。
  2. AさんがBさんにネットワークを介して、情報を送ります。
  3. Bさんが共通鍵で届いた情報を復号します。

共通鍵方式ではAさんもBさんも同じ鍵を使い暗号化と復号を行います。ポイントは「共通鍵はAさんとBさん以外に知られてはいけない」です。もし共通鍵が他者に漏れてしまった場合、盗聴されて暗号が解読されてしまうからです。

ただこの方式には根本的な問題があります(図1)。

図1

共通鍵をBさんに安全に渡す方法があるのであれば、共通鍵方式を使わずに、その方法でBさんに送りたい情報を送れば良いのだから。

■公開鍵暗号

そこで、共通鍵暗号方式とは別の方式が考え出されました。それが「公開鍵暗号方式」です。公開鍵方式では1対の鍵のペア(秘密鍵と公開鍵と呼ぶ)を生成し、AさんとBさんが別々の鍵を持ちます。通常は鍵のペアを生成したほうが秘密鍵を持ち、相手に公開鍵を渡します。Aさんが鍵を生成した場合はAさんが秘密鍵を持ち、Bさんに公開鍵を渡します。

この方式のポイントは、3つあります。

  • 秘密鍵は絶対に漏らしてはいけないが、公開鍵は他の人に渡ってもよい(むしろ公開する)。
  • 公開鍵で暗号化したものは秘密鍵で復号できる、秘密鍵で暗号化したものは公開鍵で復号できる。
  • 公開鍵を受け取ったほうから暗号文を送る。

共通鍵方式では共通鍵を渡す方法が問題でした。公開鍵方式では公開鍵を相手に渡してから(渡すときに他者に知られてもよい)通信を行います。鍵を生成し秘密鍵を持っているAさんが受信者、公開鍵を受け取ったBさんが送信者になり、通信手順は以下となります。

  1. Bさんが公開鍵で送りたい情報を暗号化します。
  2. BさんがAさんにネットワークを介して、情報を送ります。
  3. Aさんが秘密鍵で届いた情報を復号します。

公開鍵はBさん以外にも知られることになりますが、公開鍵から秘密鍵を生成することはできないので暗号化された内容を復号できるのは秘密鍵をもつAさんだけです。これで安全な通信ができるようになりました。

いや、、果たしてそうでしょうか(図2)?

図2

Aさんは公開鍵を公開してしまったのでBさんでない誰かがBさんを装い、Aさんに暗号文を送ってきたかもしれません。これでは安全な通信とは言えません。どうしたら良いでしょうか・・。

「安全な通信を考える(ハッシュ関数/電子署名)」に続く

さくらのレンタルサーバーでmysqlコマンドを使用する。

さくらのレンタルサーバーで、mysqlコマンドを使用する方法です。さくらのサポート情報によるとmysqlコマンドは使えるとのことでした。

さくらのサポート情報をもとにMySQL、Wordpressのインストールまで完了。SSHでレンタルサーバにログインし、wp-config.phpの中身を確認してみる。wp-config.phpは以下の場所にあります。

/home/example(※1)/www/wp(※2)

(※1):初期ドメインで指定したアカウント
(※2):Wordpressのインストール時に指定したインストール先

ここで、以下の情報を再確認。

・ユーザ名(DB_USER)
・パスワード(DB_PASSWORD)
・ホスト名(DB_HOST)
・文字コード(DB_CHARSET)
・データベース名(DB_NAME)

早速、SSHでレンタルサーバ接続してmysqlコマンドでDBにアクセスしてみると、、、。

% mysql -u (ユーザ名) -p
Enter password: (パスワードを入力)
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
%

繋がりませんでした・・。

そのあと調べてみてわかりましたが、さくらのレンタルサーバーはアプリケーションサーバーとデータベースサーバーが別なのでホスト名を指定しないと繋がらないようです。以下のようにすると繋がります。

% mysql -h (ホスト名) -u (ユーザ名) -p
Enter password: (パスワードを入力)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is ・・
Server version: 5.7.23-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>
mysql> use (データベース名を入力)
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>

さくらのサポート情報にmysqlコマンドが使用できると書いてあったものの、惑わされたため書いておきました。