【PHP】OpenSSL関数によるデータ暗号化

#PHP
written by みよしや

こんにちは、みよしやです。

今回は、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を使用した暗号化&復号を試してみてください。

ご覧いただきありがとうございました。