PHP OpenSSL入門!10のステップでデータの暗号化・復号化 – Japanシーモア

PHP OpenSSL入門!10のステップでデータの暗号化・復号化

PHPとOpenSSLを用いたデータ暗号化と復号化のプロセスを解説するイラストPHP
この記事は約22分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

はじめまして、今回の記事では、PHPとOpenSSLを使ってデータの暗号化と復号化を行う方法をステップバイステップで学びます。

この記事を読み終える頃には、あなたもPHPとOpenSSLを使ってデータを安全に扱うことができるようになるでしょう。

それでは、早速本題に入りましょう。

●PHPとOpenSSLとは?

まず、PHPとOpenSSLについて基本的な説明をしましょう。

○PHPについて

PHPは、「PHP: Hypertext Preprocessor」の略で、サーバーサイドのスクリプト言語の一つです。

主にウェブ開発に使われ、HTML内に直接記述することが可能です。

そのため、データベースとの連携や動的なウェブページの生成に便利な言語とされています。

○OpenSSLについて

OpenSSLは、通信を暗号化するためのソフトウェアライブラリです。

SSL/TLSプロトコルを用いて、インターネット上の通信の安全性を保証します。

また、OpenSSLは暗号化、復号化、証明書の管理など、幅広い暗号機能を提供しています。

●PHPとOpenSSLのインストール方法

それでは、PHPとOpenSSLをインストールする方法について説明します。

○PHPのインストール

まずは、PHPのインストールから始めます。

ここでは、Ubuntuを例に取ります。

$ sudo apt update
$ sudo apt install php

上記のコマンドをターミナルに入力し、PHPをインストールします。

これでPHPのインストールは完了です。

○OpenSSLのインストール

次に、OpenSSLのインストール方法について説明します。

OpenSSLは多くのLinuxディストリビューションでデフォルトでインストールされていますが、もしインストールされていない場合は以下のコマンドを実行します。

$ sudo apt update
$ sudo apt install openssl

これらのコマンドを実行することで、OpenSSLがインストールされます。

以上で、PHPとOpenSSLのインストールが完了しました。

次に、PHPとOpenSSLを使ってデータを暗号化・復号化する方法について見ていきましょう。

●PHPとOpenSSLの基本的な使い方

PHPとOpenSSLの基本的な使い方を学ぶために、まずは簡単なサンプルコードから見ていきましょう。

○サンプルコード1:PHPでのOpenSSLの基本的な使い方

PHPでOpenSSLを使う基本的な使い方を理解するため、下記のサンプルコードをご覧ください。

<?php
$data = "こんにちは、世界";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);

echo $decrypted;
?>

このコードでは、PHPのOpenSSL関数を使って文字列を暗号化し、その後復号化することを行っています。

まず初めに暗号化するデータとして「こんにちは、世界」という文字列を用意し、それを$dataに格納します。

次に、$keyと$ivにそれぞれ暗号キーと初期ベクトルを生成し、格納します。

その後、openssl_encrypt関数を用いて$dataを暗号化し、それを$encryptedに格納します。

そして、openssl_decrypt関数を用いて$encryptedを復号化し、$decryptedに格納します。

最後に$decryptedを表示することで、元のデータが正しく復号化されていることを確認します。

このコードを実行すると、「こんにちは、世界」という文字列が表示されます。

これは、元のデータが正しく暗号化され、またそれが正しく復号化されたことを示しています。

○サンプルコード2:PHPでのOpenSSLを用いたデータ暗号化

次に、PHPとOpenSSLを用いてデータを暗号化する具体的なコードを見ていきましょう。

<?php
$data = "秘密のメッセージ";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

echo $encrypted;
?>

このコードでは、「秘密のメッセージ」という文字列を暗号化する作業を行っています。

前述のサンプルコードと同様に、暗号キーと初期ベクトルを生成し、それらを使ってデータを暗号化しています。

最終的に暗号化されたデータを表示しています。

このコードを実行すると、ランダムな文字列が表示されます。

これが、「秘密のメッセージ」を暗号化した結果です。

このランダムな文字列は、秘密の鍵と初期ベクトルがあれば元のメッセージに復号化できますが、それらがなければ元のメッセージを知ることはできません。

○サンプルコード3:PHPでのOpenSSLを用いたデータ復号化

それでは、暗号化されたデータをどのように復号化するか見ていきましょう。

<?php
$encrypted = 'ここに暗号化されたデータを入れます';
$key = 'ここに暗号化時に使用したキーを入れます';
$iv = 'ここに暗号化時に使用した初期ベクトルを入れます';

$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);

echo $decrypted;
?>

このコードでは、暗号化されたデータ、暗号化時に使用した秘密の鍵、そして初期ベクトルを用いて、データを復号化する作業を行っています。

そして、復号化されたデータを表示しています。

このコードを実行すると、暗号化されたデータが元のメッセージに戻って表示されます。

これにより、暗号化されたデータが正しく復号化されていることを確認できます。

●PHPとOpenSSLの応用例

まずは、データの安全な送信、ユーザーパスワードの安全な保存、そしてファイルの暗号化と復号化といった、具体的な応用例を見ていきましょう。

○サンプルコード4:データの安全な送信

PHPとOpenSSLを用いてデータの安全な送信を行う例を見ていきましょう。

下記のサンプルコードは、データを暗号化してから送信するためのものです。

<?php
$data = "安全に送信したいデータ";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

// ここで暗号化されたデータを送信する
?>

このコードでは、初めに送信したいデータを定義しています。

その後、暗号キーと初期ベクトルを生成し、これらを用いてデータを暗号化しています。

暗号化されたデータは、安全に送信することが可能となります。

実際の送信方法は、Web APIへのPOSTリクエストやデータベースへの保存など、使用するシステムや要件により異なります。

○サンプルコード5:ユーザーパスワードの安全な保存

次に、PHPとOpenSSLを用いてユーザーパスワードを安全に保存する例を見ていきましょう。

下記のサンプルコードは、パスワードをハッシュ化してから保存するためのものです。

<?php
$password = "ユーザーのパスワード";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// ここでハッシュ化されたパスワードを保存する
?>

このコードでは、初めにユーザーのパスワードを定義しています。

その後、password_hash関数を用いてパスワードをハッシュ化しています。

ハッシュ化されたパスワードは、そのまま元のパスワードに戻すことができないため、安全に保存することが可能となります。

実際の保存方法は、データベースへの保存など、使用するシステムや要件により異なります。

○サンプルコード6:ファイルの暗号化と復号化

最後に、PHPとOpenSSLを用いてファイルを暗号化し、その後で復号化する例を見ていきましょう。

下記のサンプルコードは、ファイルを暗号化し、その後で復号化するためのものです。

<?php
$file_path = "/path/to/your/file";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

// ファイルを開く
$file = fopen($file_path, 'r');
$data = fread($file, filesize($file_path));
fclose($file);

// データを暗号化する
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

// 暗号化されたデータを保存する
$file_encrypted_path = "/path/to/your/encrypted/file";
$file_encrypted = fopen($file_encrypted_path, 'w');
fwrite($file_encrypted, $encrypted);
fclose($file_encrypted);

// 暗号化されたデータを復号化する
$file_encrypted = fopen($file_encrypted_path, 'r');
$encrypted_data = fread($file_encrypted, filesize($file_encrypted_path));
fclose($file_encrypted);

$decrypted = openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);

// 復号化されたデータを保存する
$file_decrypted_path = "/path/to/your/decrypted/file";
$file_decrypted = fopen($file_decrypted_path, 'w');
fwrite($file_decrypted, $decrypted);
fclose($file_decrypted);
?>

このコードでは、初めに暗号化するファイルのパスと、暗号キー、初期ベクトルを定義しています。

次に、指定したパスのファイルを開き、その内容を読み込んでいます。

読み込んだデータは、指定した暗号キーと初期ベクトルを用いて暗号化され、別のファイルとして保存されます。

その後、保存した暗号化ファイルを開き、その内容を読み込み、再び元のキーと初期ベクトルを用いて復号化され、最後に別のファイルとして保存されます。

●PHPとOpenSSLの詳細な使い方

ここではPHPとOpenSSLの詳細な使い方について学びます。

特に、より強力な暗号化アルゴリズムの使用、暗号化されたデータの検証、独自の暗号化・復号化関数の作成について詳しく解説します。

○サンプルコード7:より強力な暗号化アルゴリズムの使用

既存の暗号化アルゴリズムの中には、AES-256-CBCなど、より強力なものも存在します。

<?php
$data = "より強力な暗号化を試すためのデータ";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
?>

このコードでは、初めに暗号化するデータ、暗号キー、そして初期ベクトルを定義しています。

次に、openssl_encrypt関数を用いてデータをAES-256-CBCという強力な暗号化アルゴリズムを用いて暗号化しています。

その後、同じキーと初期ベクトルを用いて、openssl_decrypt関数でデータを復号化しています。

このコードを実行すると、元のデータが暗号化され、その後復号化されるという一連の流れが再現されます。

しかし、その中間の暗号化されたデータは、元のデータと全く異なる形に変わっています。

これにより、データの安全性が向上します。

○サンプルコード8:暗号化されたデータの検証

暗号化されたデータが正しく復号化できることを確認するために、ハッシュ値を用いた検証方法を示します。

<?php
$data = "検証するためのデータ";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

$hash = hash('sha256', $encrypted);

$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);

$decrypted_hash = hash('sha256', $decrypted);

if ($hash === $decrypted_hash) {
    echo "データは正しく復号化されました。";
} else {
    echo "データ

の復号化に失敗しました。";
}
?>

このコードでは、暗号化したデータと復号化したデータそれぞれのハッシュ値を計算しています。

暗号化と復号化の過程が正しく行われれば、それぞれのハッシュ値が一致するはずです。

その確認を行うことで、データが正しく復号化されたかを検証しています。

このコードを実行した結果、”データは正しく復号化されました。”と表示されれば、データが正しく復号化されていることが確認できます。

しかし、”データの復号化に失敗しました。”と表示された場合、何らかの問題が発生している可能性があります。

○サンプルコード9:独自の暗号化・復号化関数の作成

PHPとOpenSSLを用いて、独自の暗号化・復号化関数を作成することも可能です。

<?php
function encryptData($data, $key) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    return openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
}

function decryptData($encrypted_data, $key) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}

$data = "独自の関数を試すためのデータ";
$key = openssl_random_pseudo_bytes(32);

$encrypted = encryptData($data, $key);
$decrypted = decryptData($encrypted, $key);
?>

このコードでは、最初にデータを暗号化する関数と、暗号化したデータを復号化する関数を定義しています。

それぞれの関数では、opensslの暗号化関数と復号化関数を用いています。

その後で、これらの関数を用いてデータの暗号化と復号化を行っています。

このコードを実行すると、先ほど定義した関数を用いてデータが暗号化され、その後復号化される一連の流れが確認できます。

このように、独自の関数を作成することで、より複雑な処理を簡潔に記述することが可能となります。

●PHPとOpenSSLの注意点と対処法

PHPとOpenSSLを使用する際のいくつかの注意点とその対処法について説明します。

適切な知識を持つことで、より安全に、そして効率的にシステムを開発することが可能となります。

1.暗号化キーと初期ベクトルの保存

暗号化したデータを後で復号化するためには、暗号化キーと初期ベクトルが必要です。

しかし、これらは外部に漏れるとセキュリティ上の脅威となります。

そのため、これらは適切に保管することが重要です。

それらをファイルに保存する場合、そのファイルは外部からアクセスできない場所に置くべきです。

2.openssl_random_pseudo_bytes関数の戻り値の確認

openssl_random_pseudo_bytes関数は、指定したバイト数のランダムなデータを生成します。

しかし、生成されたデータが予想外の形式である場合があります。

そのため、この関数の戻り値は適切に処理する必要があります。

<?php
$length = 32;
$key = openssl_random_pseudo_bytes($length, $crypto_strong);

if($crypto_strong === false) {
    die("暗号化に必要な強度のあるランダムデータの生成に失敗しました。");
}
?>

このコードでは、openssl_random_pseudo_bytes関数を使ってランダムなデータを生成しています。

そして、第二引数の$crypto_strongを用いて、生成されたデータが暗号学的に強度のあるものであるかを確認しています。

このコードを実行した結果、暗号化に必要な強度のあるランダムデータの生成に失敗しましたというエラーメッセージが表示された場合、ランダムなデータの生成に問題が発生しています。

3.データの暗号化と復号化の間に生じるエラーの確認

データの暗号化と復号化を行う際、エラーが生じる可能性があります。

その場合、openssl_error_string関数を用いてエラーメッセージを取得することが可能です。

<?php
$data = "エラーチェックを行うためのデータ";
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));

$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);

if($encrypted === false) {
    die('暗号化エラー: '

 . openssl_error_string());
}

$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);

if($decrypted === false) {
    die('復号化エラー: ' . openssl_error_string());
}
?>

このコードでは、まずデータを暗号化しています。

その後、暗号化されたデータを復号化しています。それぞれの過程でエラーが生じた場合、そのエラーメッセージを表示します。

このコードを実行した結果、暗号化エラーまたは復号化エラーというエラーメッセージが表示された場合、それぞれの過程で問題が生じています。

●PHPとOpenSSLのカスタマイズ方法

PHPとOpenSSLを用いて、自分だけの独自の暗号化・復号化システムを作成するための基本的な手順を紹介します。

次のステップではカスタム暗号化関数の作成方法について述べます。

1.キーと初期ベクトルの生成

最初のステップは、暗号化と復号化に必要なキーと初期ベクトルの生成です。

これらはopenssl_random_pseudo_bytes関数を使用して生成します。

<?php
$key = openssl_random_pseudo_bytes(32);  // 32バイトのキーを生成
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));  // AES-256-CBCのIV長を取得し、IVを生成
?>

このコードでは、openssl_random_pseudo_bytes関数を用いて、暗号化と復号化に必要なキーと初期ベクトルを生成しています。

キーは32バイトのランダムなデータとして、初期ベクトルはaes-256-cbc暗号のIV長に対応するランダムなデータとして生成します。

2.データの暗号化

次に、openssl_encrypt関数を用いてデータを暗号化します。

これは、暗号化したいデータ、使用する暗号法、キー、オプション、初期ベクトルをパラメータとして受け取ります。

<?php
$data = "暗号化したいデータ";
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
?>

このコードでは、openssl_encrypt関数を使ってデータを暗号化しています。

aes-256-cbc暗号法を使用し、先ほど生成したキーと初期ベクトルを用いています。

このコードを実行すると、$encrypted変数に暗号化されたデータが格納されます。

3.データの復号化

最後に、openssl_decrypt関数を用いて暗号化されたデータを復号化します。

これは、暗号化されたデータ、使用した暗号法、キー、オプション、初期ベクトルをパラメータとして受け取ります。

<?php
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
?>

このコードでは、openssl_decrypt関数を使って暗号化されたデータを復号化しています。

aes-256-cbc暗号法を使用し、暗号化に使った同じキーと初期ベクトルを用いています。

このコードを実行すると、$decrypted変数に復号化されたデータが格納され、元のデータが復元されます。

これらのステップを踏むことで、PHPとOpenSSLを用いてカスタムの暗号化・復号化システムを構築することができます。

ただし、適切なエラーハンドリングを行い、セキュリティ対策を確実に施すことが重要です。

○サンプルコード10:カスタム暗号化関数の作成

PHPとOpenSSLを用いたカスタム暗号化関数と復号化関数の作成例を紹介します。

これらの関数は、aes-256-cbc暗号を用いて任意の文字列を暗号化・復号化します。

<?php
function encryptData($data, $key) {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
    return base64_encode($encrypted . '::' . $iv);
}

function decryptData($data, $key) {
    list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
    return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
?>

このコードでは、encryptData関数とdecryptData関数を定義しています。

encryptData関数は、データとキーを引数として受け取り、データを暗号化します。

そして、暗号化されたデータと初期ベクトルを’::’で結合し、base64でエンコードした文字列を返します。

一方、decryptData関数は、暗号化されたデータとキーを引数として受け取ります。

暗号化されたデータから元のデータと初期ベクトルを取り出し、元のデータを復号化します。

それでは、これらの関数を使ってデータを暗号化・復号化する例を見てみましょう。

<?php
$key = openssl_random_pseudo_bytes(32);  // 32バイトのキーを生成
$data = "Hello, World!";  // 暗号化したいデータ

// データを暗号化
$encryptedData = encryptData($data, $key);
echo "暗号化されたデータ: " . $encryptedData . "\n";

// データを復号化
$decryptedData = decryptData($encryptedData, $key);
echo "復号化されたデータ: " . $decryptedData . "\n";
?>

このコードでは、先ほど定義したencryptData関数とdecryptData関数を使ってデータを暗号化・復号化しています。

暗号化されたデータはbase64エンコードされた形で出力され、それをdecryptData関数で復号化します。

復号化されたデータは元のデータ”Hello, World!”と同じになります。

以上が、PHPとOpenSSLを用いたカスタム暗号化関数と復号化関数の作成方法です。

これらのコードは一例であり、具体的な使用状況によって適宜カスタマイズしてご使用ください。

まとめ

今回の記事では、PHPとOpenSSLを使用してデータの暗号化と復号化を行う方法を学びました。

まずは、PHPとOpenSSLを導入し、基本的な暗号化と復号化を行いました。

次に、OpenSSLの機能をカスタマイズする方法を学び、それを用いて自分自身の暗号化と復号化の関数を作成しました。

OpenSSLは、安全なデータ通信を保証するための強力なツールです。

PHPと組み合わせることで、その強力な機能をウェブアプリケーションに取り入れることができます。

本記事で紹介したような基本的な暗号化と復号化の処理は、ウェブサイトのセキュリティを確保する上で極めて重要なスキルと言えます。

今回学んだ内容は、あくまで基本的な部分に過ぎません。OpenSSLは非常に複雑なライブラリで、その全ての機能を網羅するにはさらなる学習が必要です。

しかし、基本的な暗号化と復号化の仕組みを理解し、それを実装できるようになることは、セキュリティ意識の高いプログラミングスキルを身につける第一歩となるでしょう。

最後に、本記事のサンプルコードがPHPとOpenSSLを用いたデータの暗号化と復号化についての理解を深める助けとなれば幸いです。

セキュリティはウェブ開発において最も重要な要素の一つです。

ぜひ今回学んだ知識を活かして、より安全なウェブアプリケーションの開発に挑戦してみてください。

以上で、PHPとOpenSSLを使用してデータの暗号化と復号化を行うためのガイドは終了です。

このガイドがあなたの学習にとって有益であったことを願っています。

それでは、次回の学習でも一緒に頑張りましょう。