【PHP】OpenSSL関数によるデータ暗号化
こんにちは、みよしやです。
今回は、PHPでOpenSSL関数を使用してデータの暗号化&復号をする方法について書いていきます。
OpenSSLとは
OpenSSLは、インターネット上でのデータの暗号化・復号をするためのソフトウェアです。
オープンソースで開発されており、WindowsやLinuxなど各プラットフォームで利用できます。
PHPにはあらかじめOpenSSLの機能を利用するライブラリが用意されているため、
今回はこのライブラリを使用してデータの暗号化・復号を行っていきます。
暗号化通信の必要性について
インターネット上での通信を暗号化し第三者によるデータの盗聴や改ざんを防ぐことが、SSL/TLSでの暗号化通信の目的です。
現在、クレジットカード情報は非保持化が義務付けられていますが、
氏名や住所などの個人情報はブラウザ,サーバー間で通信することが多いため、暗号化通信を行う必要があります。
データの暗号化
暗号化する場合は関数openssl_encryptを使用します。
openssl_encrypt(
《対象データ》,
《暗号方式》,
《共通鍵》,
《オプション》,
《初期化ベクトル》
);
引数の説明
対象データ:暗号化対象の文字列
暗号方式:
暗号化アルゴリズムを指定する。
利用可能な暗号方式は関数openssl_get_cipher_methodsで確認できる。
共通鍵:暗号化&復号に使用するパスワード。
オプション:
返却データの形式などを指定。
定数のOPENSSL_RAW_DATAもしくはOPENSSL_ZERO_PADDINGをセットする。
初期化ベクトル:
暗号を複雑化させるランダムなビット列。
暗号方式によって必要な長さは変わるため、関数openssl_cipher_iv_lengthで初期ベクトルの長さを取得する。
データの復号
復号する場合は関数openssl_decryptを使用します。
openssl_decrypt(
《対象データ》,
《暗号方式》,
《共通鍵》,
《オプション》,
《初期化ベクトル》
);
対象データには暗号化された文字列を入れます。
それ以外の引数は暗号化時と同一になるため割愛します。
サンプルコード
(暗号方式3DESの例)
<?php
class Sample
{
// 暗号方式
const ENCRYPT_METHOD = 'des-ede3-cbc';
// 3DES暗号化キー
private $encrypt_key = 'samplepass';
// 3DES初期化キー
private $init_key;
public function __construct() {
// 暗号化処理呼出
$this->setData('サンプル文字列');
// 復号処理呼出
$this->getData();
}
/**
* データを暗号化して保存
* @param string $str
*/
public function setData($str) {
// 暗号方式に応じた初期ベクトルの長さを取得しランダム生成
$iv_length = openssl_cipher_iv_length(self::ENCRYPT_METHOD);
$this->init_key = openssl_random_pseudo_bytes($iv_length);
// 対象データを暗号化
$encrypt_string = $this->encrypt($str);
// 暗号化したデータをDBに保存(省略)
}
/**
* データを取得し復号
* @return string
*/
public function getData() {
// DBから暗号化データを取得(省略)
// 対象データを復号
return $this->encrypt($encrypt_string);
}
/**
* 暗号化処理
* @param string $str
* @return string
*/
private function encrypt($str)
{
$encrypt_string = openssl_encrypt(
$str,
self::ENCRYPT_METHOD,
$this->encrypt_key,
OPENSSL_ZERO_PADDING,
$this->init_key
);
return $encrypt_string;
}
/**
* 復号処理
* @param string $str
* @return string
*/
private function decrypt($str)
{
$decrypted_string = openssl_decrypt(
$str,
self::ENCRYPT_METHOD,
$this->encrypt_key,
OPENSSL_ZERO_PADDING,
$this->init_key
);
return $decrypted_string;
}
}
最後に
WEB系の開発で個人情報を扱う場合は、暗号化通信が必要なタイミングが出てくると思います。
その場合は今回説明したOpenSSLを使用した暗号化&復号を試してみてください。
ご覧いただきありがとうございました。