PHPのプログラムの中で重要なデータを扱うのなら、そのデータの暗号化が必要です。今インターネットを使う仕組むでは、セキュリティ対策が必須です。PHPで動作しているWebシステムも例外ではありません。
PHPではOpenSSLを利用した暗号化ライブラリを利用できるので、これを利用してください。とはいえ、暗号化処理は難しそう、と思う方もいるでしょう。そこで今回は、PHPで利用できるOpenSSLを利用した暗号化の仕組みについて解説します。
目次
PHPでも暗号化は必須
今インターネットを利用するならセキュリティ対策が欠かせません。そして、セキュリティ対策が必要なデータをインターネットでやりとりするなら、そのデータの暗号化は必須です。PHPでWebサービスを構築する方なら、PHPによる暗号化が避けられません。
とはいえ暗号化と言われてもよく分からない、という方もいるでしょう。そこでまずは今使われている暗号化の基本について解説します。
【参考】セキュリティの重要性を扱った記事
公開鍵暗号方式
今インターネットの通信で使われている暗号化方式が公開鍵暗号方式です。この方法は、暗号化するためのキーと暗号を解読するためのキーが別で、しかも、暗号化に使われたキーでは解読できない点が特徴です。
そして暗号化するためのキーを公開して使用することから、公開鍵暗号方式と呼ばれます。
具体的には、データを送ってくれる相手に暗号化するためのキーを渡し、そのキーを使ってデータを暗号化して送信してもらいます。なお暗号化されたデータは、その暗号化するためのキーで解読できません。
そして、その暗号化されたデータを受け取ったら、公開していない暗号を解読するためのキーを使って元のデータに戻します。
OpenSSLを利用する
先ほど説明した共通鍵暗号化方式を利用した、インターネット上におけるデータの暗号化およびその解読する仕組みがOpenSSLです。このOpenSSLは、暗号化するためのキーおよび解読するためのキーを生成するツールや、共通鍵暗号化方式を用いて通信するための機能を提供します。
なおOpenSSLはオープンソースで開発されており、LinuxやWindowsなど多くのプラットフォームで利用できます。さらに各プログラム言語から利用するためのインターフェースが用意されており、PHPから利用できる暗号化のための関数もOpenSSLが使われています。
PHPでOpenSSLを利用するには
PHPにはOpenSSLのライブラリを呼び出して、共通鍵暗号化方式でデータを暗号化するため関数を集めたライブラリが用意されています。
もし、CentOSやUbuntuなどのLinuxに、yumコマンドやaptコマンドを使ってPHPをインストールする場合、php-sslパッケージを追加してください。
また、PHPをソースファイルから作る場合、インストールされているOpenSSLを利用するようにconfigureコマンドで指定してMakefileを作ることで、OpenSSLのライブラリを組み込んだPHPの作成が可能です。
PHPのOpenSSL関数
PHPで文字列などのデータを暗号化する場合、OpenSSLライブラリの関数を使います。
その中でも公開鍵で暗号化する関数がopenssl_public_encryptで、暗号化されたデータを秘密鍵で解読する関数がopenssl_private_decryptです。次からこの2つの関数の使い方を紹介します。
openssl_public_encrypt
PHPで公開鍵暗号方式の公開鍵を用いてデータを暗号化するための関数がopenssl_public_encryptです。次にこの関数の使い方を紹介します。
openssl_public_encrypt関数の文法
openssl_public_encrypt( 暗号化する文字列, 暗号化された文字列を格納する変数, 公開鍵 );
openssl_private_decrypt
PHPで公開鍵暗号方式の秘密鍵を用いてデータを解読するための関数がopenssl_private_decryptです。次にこの関数の使い方を紹介します。
openssl_private_decrypt関数の文法
openssl_private_decrypt( 暗号化された文字列, 解読後の文字列を格納する変数, 秘密鍵 );
簡単に暗号化する方法
先ほどインターネットなどで使われる共通鍵暗号化方式を用いた公開鍵と秘密鍵の暗号化と解読方法を説明しました。しかしプログラム内部のデータなら簡単な暗号化方法でも十分、というケースもあります。
そのような場合、PHPのOpenSSLの関数により、暗号化と解読に同じキーを用いる方法も利用できます。そしてこの場合、暗号化にopenssl_encrypt関数を、また、解読にopenssl_decrypt関数を使います。
次からこの2つの関数の使い方について紹介します。
openssl_encryptの使い方
PHPを使い、パスワードを指定して文字列を暗号化する関数がopenssl_encryptです。なお、openssl_encryptでは暗号化メソッドの指定が必要です。また、パスワードも指定しますが、先ほどの公開鍵暗号方式と違い、暗号化とその解読に同じパスワードを使います。
openssl_encryptの文法
openssl_encrypt( 暗号化する文字列、暗号化メソッド、パスワード );
openssl_encryptの使用例
1 |
$encrypted_str = openssl_encrypt( $raw_str, "AES-128-CBC", $key ); |
これは、$raw_strに格納された文字列を、AES-128-CBCという暗号化メソッドと$keyに格納されたパスワードで暗号化する例です。
openssl_decryptの使い方
先ほど説明したopenssl_encrypt関数で暗号化した文字列を解読して元の文字列に戻す関数がopenssl_decryptです。暗号化された文字列に対して、暗号化メソッドと暗号化に使ったパスワードを使用して解読します。
openssl_decryptの文法
openssl_encrypt( 暗号化された文字列、暗号化メソッド、パスワード );
openssl_decryptの使用例
1 |
$str = openssl_decrypt( $encrypted_str, "AES-128-CBC", $key ); |
これは先ほどopenssl_encrypt関数の例で暗号化した文字列を解読する例です。暗号化した際に使用したパスワードと同じパスワードを使用します。
暗号化された文字列の注意点
これまで説明したようにPHPで文字列を暗号するには、Opensslライブラリの関数を利用します。しかし、暗号化された文字列が表示できるとは限りません。無理して表示すると文字化けしたり、プログラムが正常に動作しないこともあります。
もし、暗号化した文字列を表示したりメールで送受信する場合は、base64に変換するなど文字化けしないように対策してください。
暗号化した文字列にbase64を適用する例
1 2 3 4 5 6 7 |
(送信側) $encrypted_str = openssl_encrypt( $raw_str, "AES-128-CBC", $key ); $text = base64_encode($encrypted_str); (受信側) $encrypted_str = base64_decode($text); $str = openssl_decrypt( $encrypted_str, "AES-128-CBC", $key ); |
まとめ
多くの人がインターネットを利用する今の時代、データを安全に送受信するために暗号化が必須です。PHPでWebシステムを開発する立場にあるエンジニアは、暗号化の重要性を理解したうえでプログラミングしなければなりません。
今回、PHPで文字列を暗号化する関数を紹介しましたが、PHPのOpenSSLクラスには他にも多くの関数が定義されています。必要に応じてそのような暗号化処理を活用しデータを安全に扱う方法をマスターしてください。