PHPで実現する!初心者でもわかるデータ暗号化の5つの方法

PHPを用いたデータ暗号化のプロセスを示すイラスト PHP

 

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

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

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

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

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

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

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

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

はじめに

”データ暗号化”これはインターネット上で情報を安全にやり取りするために不可欠な技術です。

特に、個人情報や重要なビジネスデータを扱う場合、暗号化は必須となります。

しかし、初心者にとっては少々難易度が高く感じるかもしれません。

この記事を読めば、PHPを用いたデータ暗号化の基本的な手法とその応用例を理解することができます。

具体的なサンプルコードとともに解説を行うので、PHP初心者でも理解しやすい内容となっています。

●PHPにおけるデータ暗号化とは

データ暗号化とは、データを特定のルール(アルゴリズム)に基づき、他人には理解不能な形に変換することを指します。

この暗号化により、データは外部の不正なアクセスから保護されます。

PHPはウェブ開発で広く使用されている言語で、セキュリティ面でも優れた機能を提供しています。

PHPには、データを暗号化するための組み込み関数が多数用意されており、これらを使うことで安全に情報を扱うことができます。

○データ暗号化の必要性

データ暗号化は、情報漏洩を防ぐために重要な役割を果たします。

パスワードやクレジットカード情報、機密性の高いビジネスデータなどを扱う際には、これらの情報が第三者に盗み見られることなく安全に送受信できるように暗号化することが求められます。

また、データ暗号化は法規制への対応としても必要とされています。個人情報の保護に関する法律や、GDPR(一般データ保護規則)など、多くの国や地域で情報の安全な取り扱いが法律で定められています。

●PHPでのデータ暗号化の基本的な手法

それでは、PHPでのデータ暗号化の基本的な手法を見ていきましょう。

ここでは、パスワードのハッシュ化やAES暗号化の実装、そしてデータの復号化について解説します。

○サンプルコード1:パスワードのハッシュ化

まずはパスワードのハッシュ化から見ていきましょう。ハッシュ化とは、データを一定の長さの文字列に変換することを指します。

この変換は一方向であり、ハッシュ化されたデータから元のデータを復元することは不可能です。

<?php
$password = "secret";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
echo $hashed_password;
?>

このコードでは、PHPの組み込み関数であるpassword_hashを使ってパスワードをハッシュ化しています。

この例では、”secret”という文字列をハッシュ化し、その結果を表示しています。

PASSWORD_DEFAULTは、PHPが推奨するデフォルトのハッシュアルゴリズムを指定しています。

○サンプルコード2:AES暗号化の実装

次に、AES暗号化の実装を見ていきましょう。

AES(Advanced Encryption Standard)は、共通鍵暗号化の一つであり、高いセキュリティを提供します。

<?php
$data = "secret data";
$key = "encryption key";
$method = "AES-256-CBC";
$ivLength = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivLength);

$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
echo base64_encode($encrypted);
?>

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

この例では、”secret data”という文字列を暗号化し、その結果を表示しています。

初期化ベクタ(IV)は、暗号化の際に用いられるランダムな値で、openssl_random_pseudo_bytes関数により生成しています。

○サンプルコード3:データの復号化

暗号化したデータを元に戻す、つまり復号化する方法も見ておきましょう。

下記のサンプルコードは、先程暗号化したデータを復号化する例です。

<?php
$encrypted = base64_decode($encrypted);
$decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;
?>

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

この例では、先程AES-256-CBC方式で暗号化したデータを復号化し、その結果を表示しています。

復号化には、暗号化時と同じ鍵と初期化ベクタ(IV)が必要です。

●PHPでのデータ暗号化の応用例

基本的な暗号化手法を理解したところで、次に具体的な応用例を見てみましょう。

ここでは、ユーザー情報のセキュアな保存と安全なデータ転送について解説します。

○サンプルコード4:ユーザー情報のセキュアな保存

ユーザー情報をデータベースに保存する際には、暗号化を行うことで情報を保護することができます。

下記のサンプルコードでは、ユーザーのパスワードをハッシュ化してデータベースに保存する例を示します。

<?php
$user = 'user';
$password = 'password';
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $db->prepare('INSERT INTO users (user, password) VALUES (:user, :password)');
$stmt->bindParam(':user', $user);
$stmt->bindParam(':password', $hashed_password);
$stmt->execute();
?>

このコードでは、PHPのPDO拡張を使ってMySQLデータベースに接続し、ユーザー名とハッシュ化されたパスワードをusersテーブルに保存しています。

この例では、ユーザー名とパスワードをデータベースに保存する前に、パスワードをハッシュ化しています。

○サンプルコード5:安全なデータ転送

データを安全に他のシステムに転送する場合には、転送前にデータを暗号化します。

下記のサンプルコードは、データを暗号化してから転送する例を示しています。

<?php
$data = 'secret data';
$key = 'encryption key';
$method = 'AES-256-CBC';
$ivLength = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivLength);

$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);

// 送信先に暗号化されたデータとIVを送る
sendToRemote($encrypted, $iv);
?>

このコードでは、データをAES-256-CBC方式で暗号化し、その暗号化されたデータと初期化ベクタ(IV)を送信先に送っています。

この例では、データを暗号化してから送信しているため、データが途中で盗まれても、暗号化キーがなければ内容を読み取ることはできません。

●暗号化時の注意点と対処法

データを暗号化する際には、いくつかの注意点があります。

まず、使用する暗号化キーは秘密に保つことが非常に重要です。暗号化キーが第三者に漏れると、そのキーを使って暗号化されたデータを復号化できてしまいます。

また、パスワードのハッシュ化においては、塩(salt)を使用することを推奨します。

塩を加えることで、同じパスワードでも異なるハッシュ値を生成でき、レインボーテーブル攻撃を防ぐことができます。

さらに、暗号化アルゴリズムには多くの種類があり、それぞれに特性と適用するべきシーンがあります。

例えば、AESはブロック暗号の一つで、高速な処理が可能な一方、暗号化するデータの長さが一定でなければなりません。

そのため、データの長さが一定でない場合には、パディングを行うなどの対処が必要です。

●暗号化処理のカスタマイズ方法

PHPの暗号化関数は、さまざまな設定をカスタマイズできます。

例えば、password_hash関数では、コストパラメータを設定することでハッシュ化にかかる時間を調整できます。

このコストパラメータを高く設定すればするほど、ハッシュ化に時間がかかりますが、それだけ攻撃者が元のパスワードを推測するのに時間がかかるようになります。

また、openssl_encrypt関数では、暗号化アルゴリズムや初期化ベクタの長さなどを変更することができます。

これにより、特定の要件に合わせて暗号化の設定を最適化することができます。

まとめ

PHPでのデータ暗号化は、ユーザー情報の保護やデータの安全な転送に不可欠です。

この記事を通じて、PHPでのデータ暗号化の基本的な手法とその応用例を理解できたことでしょう。

ただし、暗号化は状況に応じて適切な方法を選ぶ必要があります。