特にインターネット上で大量のトランザクションが発生し、大量のデータが送信されることを考えると、データ暗号化は私たちの生活においてますます重要になっています。セキュリティ対策の導入に興味がある場合は、PHP が提供する一連のセキュリティ機能について学ぶことにも興味があるでしょう。この記事では、アプリケーションにセキュリティ機能を追加できるように、これらの機能を紹介し、基本的な使用法をいくつか紹介します。
予備知識
PHP のセキュリティ機能を詳しく紹介する前に、暗号化についてまだ詳しくない読者に、暗号化に関する基本的な知識を説明するために少し時間を割く必要があります。暗号化の基本概念をすでによく理解している場合は、読み飛ばしていただいても構いません。この部分。 。
暗号動物学は、大まかに言うと、暗号化と復号化の研究と実験です。暗号化は、わかりやすいデータを理解できないデータに変換するプロセスであり、復号化は、理解できないデータを元のわかりやすいデータに変換するプロセスです。理解しにくい情報を暗号、理解しやすい情報を平文と呼びます。
データの暗号化/復号化には特定のアルゴリズムが必要です。これらのアルゴリズムは、有名なシーザー コードなど、非常に単純なものもありますが、現在の暗号化アルゴリズムは比較的複雑で、既存の方法では解読できないものもあります。
PHP暗号化機能
Windows 以外のプラットフォームの使用経験が少しある人は、crypt() に精通しているかもしれません。この関数は、一部のプレーン コードを暗号化できますが、パスワードを元のプレーン コードに変換することはできません。これは一見役に立たない機能のように見えるかもしれませんが、システム パスワードの整合性を確保するために広く使用されています。一方向暗号化されたパスワードは、第三者の手に渡ると平文に戻すことができないため、ほとんど役に立ちません。ユーザーが入力したパスワードを検証するときも、ユーザーの入力は一方向アルゴリズムを使用します。入力が保存されている暗号化されたパスワードと一致する場合、入力されたパスワードは正しい必要があります。
PHP では、crypt() 関数を使用して一方向の暗号化を完了する機能も提供します。ここで関数について簡単に説明します: string crypt (string input_string [, string Salt])
input_string パラメータは暗号化する必要がある文字列で、2 番目のオプションのソルトは暗号化されたパスワードに影響を与える可能性のあるビット文字列で、いわゆる事前計算攻撃の可能性をさらに排除します。デフォルトでは、PHP は 2 文字の DES 干渉文字列を使用します。システムで MD5 (MD5 アルゴリズムについては後で紹介します) を使用する場合は、12 文字の干渉文字列が使用されます。ちなみに、次のコマンドを実行すると、システムが使用する干渉文字列の長さを確認できます: print "My system Salt size is: "。
システムは他の暗号化アルゴリズムもサポートする場合があります。 crypt() は 4 つのアルゴリズムをサポートします。サポートするアルゴリズムと対応する Salt パラメーターの長さは次のとおりです。
アルゴリズム
塩の長さ
CRYPT_STD_DES
2 文字 (デフォルト)
CRYPT_EXT_DES
9文字
CRYPT_MD5
102/tdで始まる12文字>
CRYPT_BLOWFISH
102/tdで始まる16文字>
crypt()を使用したユーザー認証の実装
crypt() 関数の例として、正しいユーザー名とパスワードを提供できるユーザーのみにディレクトリへのアクセスを制限する PHP スクリプトを作成する状況を考えてみましょう。私のお気に入りのデータベースである MySQL のテーブルにデータを保存します。 members というテーブルを作成することから例を始めましょう。
mysql>CREATE TABLE members (
->ユーザー名 CHAR(14) NOT NULL,
->パスワード CHAR(32) NOT NULL,
->PRIMARY KEY(ユーザー名)
->);
次に、次のデータがすでにテーブルに格納されていると仮定します。
ユーザー名
パスワード
クラーク
ケロD1C377lKE
ブルース
ba1T7vnz9AWgk
ピーター
ぱるvRWsRLZ4U
これらの暗号化されたパスワードに対応する平文コードは、それぞれ kent、banner、parker です。各パスワードの最初の 2 文字に注意してください。これは、次のコードを使用してパスワードの最初の 2 文字に基づいて干渉文字列を作成したためです。
.
= substr(, 0, 2);
= crypt(, );
// その後、ユーザー名とともに MySQL に保存されます
Apache のパスワード応答認証構成を使用して、ユーザーにユーザー名とパスワードの入力を求めます。PHP についてはあまり知られていませんが、Apache パスワード応答システムによって入力されたユーザー名とパスワードを認識できるということです。これらの ID を使用します。検証スクリプトでは 2 つの変数が使用されます。以下のコードをよりよく理解するために、時間をかけて以下のスクリプトを注意深く読み、説明にもっと注意を払ってください。
crypt() と Apache のパスワード応答検証システムの応用
= "localhost";
= "zorro";
= "hellodolly";
= "users";
// 認証を False に設定します
= 0;
// ユーザーがユーザー名とパスワードを入力しました
if (isset() && isset()) :
mysql_pconnect(, , ) または die("MySQL
サーバーに接続できません!");
mysql_select_db() または die("接続できますデータベースを選択しないでください!");
// 暗号化を実行します
= substr(, 0, 2);
= crypt(, );
// クエリを構築します
= "SELECT username FROM members WHERE
username = '' AND
password = ''";
// クエリを実行します
if (mysql_numrows(mysql_query()) == 1) :
= 1;
endif;
endif;
// 認可を確認します
if (! ) :
header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
print "このエリアに入る権限がありません。";
exit;
else :
print "これは秘密のデータです!";
endif;
?>
上記は、ユーザーのアクセス権を確認するための簡易認証システムです。重要な機密情報を保護するために crypt() を使用する場合は、デフォルトで使用される crypt() が最も安全ではなく、より高いセキュリティ要件が必要な場合にのみ使用できることに注意してください。パフォーマンスには、この後で紹介するアルゴリズムが必要です。記事。
次に、PHP━━md5() でサポートされている別の関数を紹介します。この関数は MD5 ハッシュ アルゴリズムを使用します。これには、言及する価値のあるいくつかの興味深い用途があります。
混合
ハッシュ関数は、可変長メッセージを固定長のハッシュ出力 (「メッセージ ダイジェスト」とも呼ばれます) に変換します。これは、固定長の文字列を使用してファイルの整合性をチェックし、デジタル署名とユーザー認証を検証できるため便利です。これは PHP に適しているため、PHP の組み込み md5() ハッシュ関数は可変長メッセージを 128 ビット (32 文字) のメッセージ ダイジェストに変換します。混合エンコーディングの興味深い特徴は、混合結果が元のプレーン コードの内容に依存しないため、混合情報を分析しても元のプレーン コードを取得できないことです。 文字列内の 1 文字だけを変更した場合でも、MD5 ハイブリッド アルゴリズムは 2 つのまったく異なる結果を計算します。まず、次の表の内容とそれに対応する結果を見てみましょう。
md5() を使用して文字列を混合する
= "これは私が今書いたメッセージです";
= md5();
print "ハッシュ: ";
?>
結果: ハッシュ: 81ea092649ca32b5ba375e81d8f4972c
結果の長さは 32 文字であることに注意してください。次の表をもう一度見てください。値がわずかに変更されています。
md5() を使用して、わずかに変更された文字列をシャッフルする
//メッセージに 1 つ欠けていることに注意してください
= "これは私が今書いたメッセージです";
= md5();
print "hash2:
";
?>
結果: ハッシュ 2: e86cf511bd5490d46d5cd61738c82c0c
両方の結果の長さは 32 文字ですが、平文の小さな変更が結果に大きな変更を引き起こすことがわかります。したがって、ハッシュ関数と md5() 関数は、データの小さな変更を確認する良い方法です。のツール。
crypt() と md5() にはそれぞれ用途がありますが、どちらも機能に一定の制限があります。次のセクションでは、PHP ユーザーの暗号化オプションを大幅に拡張する、Mcrypt と Mhash という 2 つの非常に便利な PHP 拡張機能を紹介します。
上記のセクションでは一方向暗号化の重要性について説明しましたが、暗号化後にパスワード データを元のデータに復元する必要がある場合があります。幸いなことに、PHP はこれを Mcrypt 拡張ライブラリの形式で提供します。
マクリプト
Mcrypt 2.5.7 Unix |
Mcrypt 2.4.7 は、強力な暗号化アルゴリズム拡張ライブラリであり、次のアルゴリズムを含む 22 のアルゴリズムが含まれています。
Blowfish RC2 Safer-sk64 xtea
キャスト-256 RC4 セーファー-sk128
DES RC4-iv サーペント
Enigma Rijndael-128 スリーウェイ
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 トゥーフィッシュ
パナマセーファープラス ウェイク
インストール:
Mcrypt は標準の PHP ソフトウェア パッケージには含まれていないため、ダウンロード アドレスは ftp://argeas.cs-net.gr/pub/unix/mcrypt/ です。ダウンロード後、次のようにコンパイルし、PHP で展開します。
Mcrypt パッケージをダウンロードします。
Gunzipmcrypt-x.x.x.tar.gz
tar -xvfmcrypt-x.x.x.tar
./configure --disable-posix-threads
作る
インストールする
cd を使用して PHP ディレクトリに移動します。
./configure -with-mcrypt=[dir] [--other-configuration-directives]
作る
インストールする
もちろん、要件や、PHP のインストールとインターネット サーバー ソフトウェアとの関係に応じて、上記のプロセスを適切に変更する必要がある場合があります。
Mcrypt を使用する
Mcrypt の利点は、多くの暗号化アルゴリズムを提供するだけでなく、データを暗号化/復号化できることです。さらに、データを処理するための 35 の関数も提供します。これらの関数の詳細についてはこの記事の範囲を超えていますが、代表的な関数をいくつか簡単に紹介します。
まず、Mcrypt 拡張ライブラリを使用してデータを暗号化する方法と、それを使用して復号化する方法を説明します。次のコードは、最初にデータを暗号化し、次に暗号化されたデータをブラウザ上に表示し、暗号化されたデータを元の文字列に復元して、ブラウザ上に表示します。
Mcrypt を使用してデータを暗号化および復号化する
// 暗号化する文字列を指定
= "ブルース・シュナイアー著の応用暗号は
素晴らしい暗号リファレンスです。";
// 暗号化/復号化キー
key = "4 スコア、20 年前";
// 暗号化アルゴリズム
= MCRYPT_RIJNDAEL_128;
// セキュリティを強化するための初期化ベクトルを作成します。
= mcrypt_create_iv(mcrypt_get_iv_size(,
MCRYPT_MODE_ECB), MCRYPT_RAND);
// 元の文字列を出力します
print "文字列:
";
// 暗号化
= mcrypt_encrypt(, key,
, MCRYPT_MODE_CBC, );
// 16 進数に変換してブラウザに出力
print "暗号化された文字列: ".bin2hex()."< ;p>";
= mcrypt_decrypt(, key,
, MCRYPT_MODE_CBC, );
print "復号化された文字列: ";
?>
上記のスクリプトを実行すると、次の出力が生成されます。
元の文字列: Bruce Schneier 著の『Applied Cryptography』は、素晴らしい暗号化リファレンスです。
暗号化された文字列: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc9ea2485047 8c 11742f5cfa1d23fe22fe8 bfbab5e
Bruce Schneier 著の『復号化された文字列: Applied Cryptography』は、素晴らしい暗号化リファレンスです。
上記のコードの 2 つの最も典型的な関数は mcrypt_encrypt() と mcrypt_decrypt() であり、それらの用途は明らかです。私は「Telegraph Codebook」モードを使用しました。Mcrypt にはいくつかの暗号化方法が用意されています。各暗号化方法にはパスワードのセキュリティに影響を与える可能性のある特定の文字があるため、各モードを理解する必要があります。暗号システムの経験がない読者にとっては、mcrypt_create_iv() 関数の方が興味深いかもしれませんが、この関数の詳細な説明はこの記事の範囲を超えていますが、この関数が作成する初期化ベクトルについても触れておきます (したがって、iv)。このベクトルにより、各情報を互いに独立させることができます。すべてのモードでこの初期化変数が必要なわけではありませんが、この変数が必要なモードで提供されていない場合、PHP は警告メッセージを発行します。
Mhash拡張ライブラリ
http://sourceforge.net/projects/mhash/
バージョン 0.8.3 の Mhash 拡張ライブラリは 12 の混合アルゴリズムをサポートしています。Mhash v.0.8.3 のヘッダー ファイル mhash.h を注意深く調べると、次の混合アルゴリズムがサポートされていることがわかります。
CRC32HAVAL160MD5
CRC32B HAVAL192 RIPEMD160
ゴストハヴァル224 SHA1
HAVAL128 HAVAL256 タイガー
インストール
Mcrypt と同様に、Mhash は PHP パッケージには含まれていません。Windows 以外のユーザーの場合、インストール プロセスは次のとおりです。
Mhash 拡張ライブラリをダウンロードする
Gunzipmhash-x.x.x.tar.gz
tar -xvfmhash-x.x.x.tar
。/構成、設定
作る
インストールする
cd
= "秘密の砦への道順です。左に2歩、右に3歩、チャチャチャです。";
= mhash(, );
print "ハッシュ化されたメッセージは "です。 bin2hex();
?>
このスクリプトを実行すると、次の出力が得られます。ハッシュされたメッセージは 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 です。
ここで bin2hex() 関数を使用する目的は、出力を理解しやすくすることです。これは、混合結果がバイナリ形式であるため、理解しやすい形式に変換する必要があります。 。
シャッフルは一方向関数であり、その結果は入力に依存しないため、この情報は公開できることに注意することが重要です。この戦略は通常、ユーザーがダウンロードしたファイルとシステム管理者が提供したファイルを比較してファイルの整合性を確保できるようにするために使用されます。
Mhash には他にも便利な機能がいくつかあります。たとえば、Mhash でサポートされているアルゴリズムの名前を出力する必要があります。Mhash でサポートされているすべてのアルゴリズムの名前は MHASH_ で始まるため、このタスクは次のコードを実行することで実行できます。
= MHASH_TIGER;
print "このデータは、".mhash_get_hash_name()." ハッシュ アルゴリズムでハッシュされています。";
?>
結果の出力は次のようになります。 このデータは TIGER ハッシュ アルゴリズムでハッシュされています。
PHP と暗号化について最後に注意すべき点が 1 つあります
PHP と暗号化に関して最後に注意すべき重要な点は、サーバーとクライアントの間で転送されるデータは転送中に安全ではないということです。 PHP はサーバー側のテクノロジーであるため、送信中のデータ漏洩を防ぐことはできません。したがって、完全に安全なアプリケーションを実装したい場合は、Apache-SSL またはその他の安全なサーバー構成を使用することをお勧めします。
結論は
この記事では、PHP の最も便利な機能の 1 つであるデータ暗号化について紹介します。PHP の組み込みの crypt() および md5() 暗号化関数について説明するだけでなく、データ暗号化用の強力な拡張ライブラリである Mcrypt および Mhash についても説明します。この記事の最後に、真に安全な PHP アプリケーションには安全なサーバーも含める必要があることを指摘しておく必要があります。PHP はサーバー側のテクノロジであるため、データのセキュリティを確保することはできません。担当編集:シャオ・リー