OpenSSL を使用した暗号化入門

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、安全な通信とデータ保護のために広く利用されているツールキットである OpenSSL を使用して、暗号化の基礎を学びます。暗号化によって読み取り可能なデータがどのように安全な形式に変換され、たとえデータが傍受されたとしても機密性がどのように維持されるかを探求します。

この実践的な体験を通じて、OpenSSL のインストール、共通鍵暗号(対称鍵暗号)の実行、および鍵の安全な管理方法について順を追って学習します。終了する頃には、オンラインバンキングやメッセージングなどの現実世界のアプリケーションで、これらの技術がどのように機密情報を保護しているかを理解できるようになります。

OpenSSL のインストール

メッセージの暗号化を始める前に、システムに OpenSSL をインストールする必要があります。OpenSSL は、トランスポート・レイヤー・セキュリティ(TLS)およびセキュア・ソケット・レイヤー(SSL)プロトコルのための堅牢でフル機能のツールキットであり、汎用的な暗号化ライブラリでもあります。デジタル通信を保護するために必要なすべての道具が入った「道具箱」だと考えてください。

  1. まず、ターミナルを開きます。ターミナルは、すべての OpenSSL コマンドを実行する場所です。この実験環境のような Linux システムでは、ターミナルがシステムツールを操作する主な手段となります。デスクトップ上で Xfce Terminal を見つけて開いてください。ターミナルの操作に慣れていなくても、各ステップを丁寧に説明するので安心してください。
Xfce Terminal window open

注意:無料ユーザーはインターネットに接続できないため、実験環境には OpenSSL があらかじめインストールされています。リストの 4 番(OpenSSL がインストールされているか確認する)までスキップしてください。Pro ユーザーにアップグレード すると、自分で OpenSSL をインストールする練習ができます。

Pro ユーザー限定
  1. ターミナルが開いたら、パッケージリストを更新する必要があります。これは、買い物を刷る前に利用可能なソフトウェアのカタログを最新の状態にするようなものです。次のコマンドを入力して Enter キーを押してください。
sudo apt-get update

sudo は、Windows の「管理者として実行」と同様に、管理者権限を付与します。システムからパスワードを求められることがありますが、これは通常のセキュリティ手順です。Linux のターミナルでパスワードを入力する際、文字は一切表示されません。最初は戸惑うかもしれませんが、これはセキュリティ上の仕様です。

  1. パッケージリストが最新になったので、OpenSSL をインストールしましょう。次のコマンドを入力してください。
sudo apt-get install openssl -y

-y フラグは、インストール時の確認に対して自動的に「はい」と答えるためのものです。画面に多くのテキストが流れますが、これはシステムが OpenSSL とその依存関係をダウンロードしてセットアップしている様子です。各行はインストールプロセスの各段階を表しています。

  1. インストール後、OpenSSL が正しくインストールされたか確認しましょう。これは、新しい家電製品をコンセントに差し込んだ後に動作確認をするようなものです。以下を入力してください。
openssl version

次のような出力が表示されるはずです。

OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

正確なバージョン番号は異なる場合がありますが、バージョン番号が返ってくれば問題ありません。この出力は、OpenSSL がインストールされ、使用準備が整っていることを示しています。

  1. よくできました!これで OpenSSL がインストールされました。このツールキットを使って、さまざまな暗号化操作を行うことができます。次のセクションでは、安全な通信の仕組みを理解するための基本である、メッセージの暗号化と復号を行っていきます。

OpenSSL の全機能に興味がある場合は、man openssl と入力してマニュアルを参照できます。このドキュメントには、利用可能なすべてのコマンドとオプションが記載されています。今は難しく感じるかもしれませんが、この実験では暗号化の知識を段階的に構築するために、実用的でよく使われる機能に焦点を当てていきます。

秘密のメッセージの作成

OpenSSL の準備が整ったので、後で暗号化するための最初の「秘密のメッセージ」を作成しましょう。これは暗号化の仕組みを理解するための重要な第一歩です。暗号化するには、まず対象となるデータが必要です。

  1. まず、コンピュータ上の正しい場所にいることを確認します。ターミナルで次のように入力してください。

    cd ~/project

    このコマンドは、現在のディレクトリ(cd は change directory の略)をホームディレクトリ内の project フォルダに変更します。~ 記号は「ホームディレクトリ」を指すショートカットです。正しいディレクトリで作業することで、ファイルを整理し、次のステップをスムーズに進めることができます。

  2. 次に、秘密のメッセージを作成します。これには echo というコマンドを使用します。次のように入力してください。

    echo "LabEx has the best labs for fun, hands-on learning." > secret.txt

    各部分の役割を確認しましょう:

    • echo は、テキストをターミナルに出力する基本的なコマンドです。
    • 引用符内のテキストが、保護したい秘密のメッセージです。
    • > 記号は、出力を画面に表示する代わりにファイルに書き込む(リダイレクトする)ことを意味します。
    • secret.txt は、メッセージを保存するファイルの名前です。
  3. 素晴らしい!ファイルが作成されました。正しく動作したか確認するために、内容を表示してみましょう。

    cat secret.txt

    cat コマンド(concatenate の略)は、ファイルの内容を表示します。これを実行すると、ターミナルに先ほどの秘密のメッセージが表示され、ファイルが正しく作成されたことが確認できます。

  4. 現在、このメッセージは暗号学で「平文(プレーンテキスト)」と呼ばれる状態で保存されています。つまり、ファイルにアクセスできる人なら誰でも読むことができます。今はこれで構いませんが、現実の世界では、機密情報をこのような形で保存すべきではありません。次のステップでは、OpenSSL を使用して、この平文を安全な「暗号文(サイファーテキスト)」に変換します。

OpenSSL によるメッセージの暗号化

それでは、平文のメッセージを、正しいパスワードがなければ読めない暗号化されたデータに変換しましょう。このプロセスを「暗号化」と呼び、デジタル通信において情報を安全に保つための基本となります。

  1. 今回は、業界標準の手法である AES-256-CBC 暗号化を使用します。この用語の各部分の意味を理解しましょう。

    • AES (Advanced Encryption Standard): 機密情報を保護するために米国政府によって承認された共通鍵暗号アルゴリズム。
    • 256: ビット単位の鍵の長さ。鍵が長いほどセキュリティは強固になります。
    • CBC (Cipher Block Chaining): 各データブロックを前のブロックに依存させるモードで、セキュリティを高めます。
  2. ファイルを暗号化するために、次の OpenSSL コマンドを使用します。

    openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -pbkdf2

    各部分の役割は以下の通りです:

    • openssl enc: OpenSSL の暗号化機能を呼び出します。
    • -aes-256-cbc: 選択した暗号化方式を指定します。
    • -salt: ランダムなデータを追加し、同じメッセージを暗号化しても毎回異なる結果になるようにして安全性を高めます。
    • -in secret.txt: 元のメッセージが含まれている入力ファイルを指定します。
    • -out secret.enc: 暗号化された出力の保存先を指定します。
    • -pbkdf2: パスワードから暗号化鍵を安全に生成するために、Password-Based Key Derivation Function 2 を使用します。
  3. このコマンドを実行すると、OpenSSL からパスワードの作成と確認を求められます。このパスワードは以下の理由で非常に重要です:

    • 実際の暗号化鍵を生成するために使用されます。
    • 後でファイルを復号する際に、入力したものと全く同じパスワードが必要になります。
    • 暗号化されたデータの安全性は、このパスワードの強度に依存します。

    注意:パスワードを入力してもターミナルには文字が表示されませんが、これは Linux システムにおける通常のセキュリティ動作です。慎重に入力し、終わったら Enter キーを押してください。

  4. 暗号化後、暗号化されたファイルが存在するか確認します。

    ls -l secret.enc

    これによりファイルの詳細が表示されます。secret.enc のサイズが 0 でなければ、暗号化は成功しています。

  5. 暗号化された内容を表示してみてください。

    cat secret.enc

    現在は暗号化されたバイナリ形式であるため、出力はランダムな文字の羅列のように見えます。これは、暗号化によって読み取り可能なデータが、適切な復号鍵なしでは意味をなさない安全な暗号文に変換されたことを示しています。

メッセージの復号

secret.enc に保存された暗号化メッセージが手に入ったので、次はプロセスを逆転させて元のメッセージを復元しましょう。「復号(デコード)」は、先ほど作成したバラバラのテキストを特別な鍵を使って元に戻すようなものです。暗号化に正しいパスワードが必要だったのと同様に、正常に復号するためにも全く同じパスワードが必要になります。

  1. 復号コマンドは暗号化と似た構造ですが、いくつか重要な違いがあります。ターミナルに次のコマンドを入力してください。

    openssl enc -aes-256-cbc -d -in secret.enc -out decrypted.txt -pbkdf2

    このコマンドの各部分を詳しく見てみましょう:

    • -d は、OpenSSL を復号モードに切り替えるための重要なフラグです。
    • -in secret.enc は、暗号化されたファイルを入力として指定します。
    • -out decrypted.txt は、復元されたメッセージを保存するファイル名を指定します。
    • 残りのパラメータ(-aes-256-cbc-pbkdf2)は、暗号化時に使用したものと完全に一致させる必要があります。
  2. このコマンドを実行すると、パスワードを求められます。これがセキュリティのチェックポイントです。暗号化時に使用したのと同一のパスワードを入力する必要があります。以下の点に注意してください:

    • 入力中、パスワードフィールドは空白のままです(セキュリティ上の仕様です)。
    • パスワードが一致しない場合、読み取り不可能な出力になります。
    • システムはパスワードが間違っていることを警告せず、単に正しく復号できないだけの場合があります。
  3. 復号に成功したら、結果を確認しましょう。cat コマンドを使用して、復号されたファイルの内容を表示します。

    cat decrypted.txt

    ターミナルに、見覚えのあるメッセージ「LabEx has the best labs for fun, hands-on learning.」が表示されるはずです。

  4. 復号が完璧に行われたことを確実にするために、diff コマンドを使って元のファイルと復号されたファイルをバイト単位で比較できます。

    diff secret.txt decrypted.txt

    diff を実行して何も出力されないのが、実は最高の結果です。これは、両方のファイルの内容が完全に一致し、差異が全くないことを証明しています。もし何か出力が表示された場合は、復号が完全には成功しなかったことを意味します。

鍵管理の重要性を理解する

最後のステップでは、暗号化鍵(またはパスワード)を安全に保管することがなぜ重要なのかを探ります。暗号化鍵はデジタルな「錠」のようなものです。正しい鍵でのみ元に戻せるようにデータをスクランブルすることで、データを保護します。適切な鍵管理がなければ、どんなに強力な暗号化も無意味になってしまいます。

もう一度ファイルを復号してみましょう。ただし、今回はわざと間違ったパスワードを使います。このデモンストレーションは、鍵管理に失敗したときに何が起こるかを示します。ターミナルで次のコマンドを実行してください。

openssl enc -aes-256-cbc -d -in secret.enc -out wrong.txt -pbkdf2

パスワードを求められたら、暗号化時に使用したものとは異なるものを意図的に入力してください。これは、パスワードを忘れてしまった場合や、権限のない誰かがデータにアクセスしようとした状況をシミュレートしています。では、結果を確認してみましょう。

cat wrong.txt

エラーメッセージが表示されるか、あるいはランダムな文字の羅列が表示されるはずです。この結果は 2 つの重要なことを示しています。1 つ目は、OpenSSL が暗号化を適切に実行したこと(パスワードなしではデータにアクセスさせなかったこと)、2 つ目は、正確なパスワードがなければ暗号化されたデータは完全に安全なままであるということです。

この簡単な実験は、暗号学のいくつかの主要な原則を証明しています。暗号化アルゴリズム(今回の場合は AES-256-CBC)は、鍵に完全に依存するように設計されています。パスワードが 1 文字でも異なれば、全く異なる出力が生成されます。現実世界のアプリケーションでは、これは以下のことを意味します:

  1. 暗号化鍵は安全に保管しなければならない(暗号化されたデータと一緒に置いてはいけない)。
  2. 暗号化には、強力でユニークなパスワードを使用すべきである。
  3. 鍵管理システムには、多くの場合バックアップ手順が含まれている。
  4. 企業環境では、鍵は頻繁にローテーション(定期的な変更)される。

暗号化されたデータの安全性は、鍵管理の実践と同じ強さしか持てないということを忘れないでください。金庫の暗証番号を金庫に貼った付箋に書かないのと同様に、暗号化鍵をどのように保存し保護するかについて、慎重に考える必要があります。

まとめ

この実験では、基本的な暗号化操作のために OpenSSL をインストールし、使用する方法を学びました。共通鍵暗号の概念を探求し、安全な鍵管理の重要性を理解しながら、ファイルの暗号化と復号を実践しました。

この実践的な体験を通じて、現代のデータセキュリティの基礎となる暗号学の基本原則に触れることができました。個人のデータ保護であれ、プロフェッショナルとしてのキャリア形成であれ、これらのスキルはサイバーセキュリティをさらに深く探求するための強固な基盤となります。