特にインターネット上で発生する多数のトランザクションと大量のデータ送信を考慮すると、データ暗号化は私たちの生活においてますます重要になっています。セキュリティ対策の導入に興味がある場合は、PHP が提供する一連のセキュリティ機能について学ぶことにも興味があるでしょう。今回は、アプリケーションソフトにセキュリティ機能を追加できるよう、これらの機能の紹介と基本的な使い方を紹介します。
予備知識
PHP のセキュリティ機能を詳しく紹介する前に、暗号化についてまだ詳しくない読者に、暗号化に関する基本的な知識を説明するために少し時間を割く必要があります。暗号化の基本概念をすでによく理解している場合は、読み飛ばしていただいても構いません。この部分。 。
暗号動物学は、暗号化/復号化の研究と実験として一般的に説明できます。暗号化は、理解しやすいデータを理解しにくいデータに変換するプロセスであり、復号化は、理解しにくいデータをデータに変換するプロセスです。わかりやすいオリジナルデータ。わかりにくい情報をコード、理解しやすい情報を明確なコードといいます。
データの暗号化/復号化には特定のアルゴリズムが必要です。これらのアルゴリズムは、有名なシーザー コードなど、非常に単純なものもありますが、現在の暗号化アルゴリズムは比較的複雑で、既存の方法では解読できないものもあります。
PHPの暗号化機能
Windows 以外のプラットフォームの使用経験が少しある人は、crypt() に精通しているかもしれません。この関数は、一部のプレーン コードを暗号化できますが、パスワードを元のプレーン コードに変換することはできません。これは一見役に立たない機能のように見えるかもしれませんが、システム パスワードの整合性を確保するために広く使用されています。一方向暗号化されたパスワードは、第三者の手に渡ると平文に戻すことができないため、ほとんど役に立ちません。ユーザーが入力したパスワードを検証するときも、ユーザーの入力は一方向アルゴリズムを使用します。入力が保存されている暗号化されたパスワードと一致する場合、入力されたパスワードは正しい必要があります。
PHP は、crypt() 関数を使用して一方向暗号化を完了する機能も提供します。ここで機能を簡単に紹介します:
string crypt (string input_string [, string Salt])
input_string パラメータは暗号化する必要がある文字列で、2 番目のオプションのソルトは暗号化されたパスワードに影響を与える可能性のあるビット文字列で、いわゆる事前計算攻撃の可能性をさらに排除します。デフォルトでは、PHP は 2 文字の DES 干渉文字列を使用します。システムで MD5 (MD5 アルゴリズムについては後で紹介します) を使用する場合は、12 文字の干渉文字列が使用されます。ちなみに、次のコマンドを実行すると、システムが使用する干渉文字列の長さを確認できます:
print "私のシステムソルトサイズは: CRYPT_SALT_LENGTH;
システムは他の暗号化アルゴリズムもサポートする場合があります。 crypt() は 4 つのアルゴリズムをサポートします。サポートするアルゴリズムと対応する Salt パラメーターの長さは次のとおりです。
アルゴリズムソルトの長さ
CRYPT_STD_DES 2 文字 (デフォルト)
CRYPT_EXT_DES 9 文字
CRYPT_MD5 $
で始まる12文字
CRYPT_BLOWFISH $
で始まる 16 文字
crypt() を使用してユーザー認証を実装します
crypt() 関数の例として、正しいユーザー名とパスワードを提供できるユーザーのみにディレクトリへのアクセスを制限する PHP スクリプトを作成する状況を考えてみましょう。私のお気に入りのデータベースである MySQL のテーブルにデータを保存します。
members という名前のテーブルを作成することから例を始めましょう:
mysql>CREATE TABLE メンバー (
->ユーザー名 CHAR(14) NOT NULL,
->パスワード CHAR(32) NOT NULL,
->主キー(ユーザー名)
->);
次に、次のデータがすでにテーブルに格納されていると仮定します。
ユーザー名 パスワード
クラーク・ケロD1C377lKE
ブルース ba1T7vnz9AWgk
ピーター・パルvRWsRLZ4U
これらの暗号化されたパスワードに対応する平文コードは、それぞれ kent、banner、parker です。各パスワードの最初の 2 文字に注意してください。これは、パスワードの最初の 2 文字に基づいて干渉文字列を作成するために次のコードを使用したためです。
$enteredPassword.
$salt = substr($enteredPassword, 0, 2);
$userPswd = crypt($enteredPassword, $salt);
// $userPswd はユーザー名と一緒に MySQL に保存されます
Apache のパスワード応答認証構成を使用して、ユーザーにユーザー名とパスワードの入力を求めます。PHP についてはあまり知られていませんが、Apache パスワード応答システムによって入力されたユーザー名とパスワードが $PHP_AUTH_USER および $PHP_AUTH_PW I として認識されるということです。は、認証スクリプトでこれら 2 つの変数を使用します。以下のコードをよりよく理解するために、時間をかけて以下のスクリプトを注意深く読み、説明にもっと注意を払ってください:
crypt() と Apache のパスワード応答検証システムの応用
$host = "http://www.jnwebseo.com";
$user = "ゾロ";
$pswd = "地獄のオドリー";
$db = "ユーザー";
// 認証を False に設定します
$authorization = 0;
// ユーザーがユーザー名とパスワードを入力したことを確認します
if (isset($PHP_AUTH_USER) &&isset($PHP_AUTH_PW)) :
mysql_pconnect($host, $user, $pswd) または die("MySQL に接続できません
サーバー!");
mysql_select_db($db) または die("データベースを選択できません!");
// 暗号化を実行します
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
// クエリを作成します
$query = "メンバーの WHERE からユーザー名を選択
ユーザー名 = '$PHP_AUTH_USER' かつ
パスワード = '$encrypted_pswd'";
// クエリを実行します
if (mysql_numrows(mysql_query($query)) == 1) :
$authorization = 1;
終わり;
終わり;
// 認可を確認します
if (! $authorization) :
header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
print "このエリアへの立ち入りは許可されていません。";
終了します;
その他:
print "これは秘密のデータです!";
終わり;
>
上記は、ユーザーのアクセス権を確認するための簡易認証システムです。重要な機密情報を保護するために crypt() を使用する場合は、デフォルトで使用される crypt() が最も安全ではなく、より高いセキュリティ要件が必要な場合にのみ使用できることに注意してください。パフォーマンスには、この後で紹介するアルゴリズムが必要です。記事。
次に、PHP━━md5() でサポートされている別の関数を紹介します。この関数は MD5 ハッシュ アルゴリズムを使用します。これには、言及する価値のあるいくつかの興味深い用途があります。
混合
ハッシュ関数は、可変長メッセージを固定長のハッシュ出力 (「メッセージ ダイジェスト」とも呼ばれます) に変換します。これは、固定長の文字列を使用してファイルの整合性をチェックし、デジタル署名とユーザー認証を検証できるため便利です。 PHP に適しているため、PHP の組み込み md5() ハッシュ関数は、可変長メッセージを 128 ビット (32 文字) のメッセージ ダイジェストに変換します。混合エンコーディングの興味深い特徴は、混合結果が元のプレーン コードの内容に依存しないため、混合情報を分析しても元のプレーン コードを取得できないことです。 文字列内の 1 文字だけを変更した場合でも、MD5 ハイブリッド アルゴリズムは 2 つのまったく異なる結果を計算します。まず、以下の表の内容とそれに対応する結果を見てみましょう:
md5() を使用して文字列を混合します
$msg = "これは私が今書いたメッセージです";
$enc_msg = md5($msg);
print "ハッシュ: $enc_msg ";
>
結果:
ハッシュ: 81ea092649ca32b5ba375e81d8f4972c
結果の長さは 32 文字であることに注意してください。 $msg の値が少し変更されているので、以下の表を見てみましょう。
少し変更した文字列をミックスするには md5() を使用します
//メッセージに が 1 つ欠けていることに注意してください
$msg = "これは私が書いたばかりのメッセージです";
$enc_msg = md5($msg);
print "ハッシュ2: $enc_msg
";
>
結果:
ハッシュ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
Cast-256 RC4 セーファー-sk128
DES RC4-iv サーペント
Enigma Rijndael-128 スリーウェイ
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 Twofish
パナマセーファープラス ウェイク
インストール:
Mcrypt パッケージをダウンロードします。
Gunzipmcrypt-x.x.x.tar.gz
tar -xvfmcrypt-x.x.x.tar
./configure --disable-posix-threads
作る
インストールする
PHP ディレクトリに cd します。
./configure -with-mcrypt=[dir] [--other-configuration-directives]
作る
インストールする
もちろん、要件や、PHP のインストールとインターネット サーバー ソフトウェアとの関係に応じて、上記のプロセスを適切に変更する必要がある場合があります。
Mcryptを使用する
まず、Mcrypt 拡張ライブラリを使用してデータを暗号化する方法、次にそれを使用して復号化する方法を紹介します。次のコードは、最初にデータを暗号化し、次に暗号化されたデータをブラウザ上に表示し、暗号化されたデータを元の文字列に復元して、ブラウザ上に表示します。
Mcrypt を使用してデータを暗号化および復号化します
// 暗号化する文字列を指定
$string = "ブルース・シュナイアーによる応用暗号学は
素晴らしい暗号リファレンスです。";
//暗号化/復号化キー
$key = "4 スコアと 20 年前";
// 暗号化アルゴリズム
$cipher_alg = MCRYPT_RIJNDAEL_128;
// セキュリティを強化するために初期化ベクトルを作成します。
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg,
)
MCRYPT_MODE_ECB)、MCRYPT_RAND);
// 元の文字列を出力します
print "元の文字列: $string
";
// $string を暗号化します
$encrypted_string = mcrypt_encrypt($cipher_alg, $key,
$string、MCRYPT_MODE_CBC、$iv);
// 16進数に変換してブラウザに出力
print "暗号化された文字列: ".bin2hex($encrypted_string)"
";
$decrypted_string = mcrypt_decrypt($cipher_alg, $key,
$encrypted_string、MCRYPT_MODE_CBC、$iv);
print "復号化された文字列: $decrypted_string";
>
上記のスクリプトを実行すると、次の出力が生成されます:
元の文字列: Applied Cryptography (Bruce Schneier 著) は、素晴らしい暗号化リファレンスです。
暗号化された文字列: 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 を注意深く調べると、次のミキシング アルゴリズムがサポートされていることがわかります。
CRC32 HAVAL160 MD5
CRC32B HAVAL192 RIPEMD160
ゴストハヴァル224 SHA1
HAVAL128 HAVAL256 タイガー
Mcrypt と同様に、Mhash は PHP パッケージには含まれていません。Windows 以外のユーザーの場合は、インストール プロセスを次に示します。
Mhash 拡張ライブラリをダウンロード
Gunzipmhash-x.x.x.tar.gz
tar -xvfmhash-x.x.x.tar
./configure
作る
インストールする
CD
./configure -with-mhash=[dir] [--other-configuration-directives]
作る
インストールする
Mcrypt と同様、インターネット サーバー ソフトウェアへの PHP のインストール方法によっては、Mhash の追加構成が必要になる場合があります。
Windows ユーザーの場合は、Mhash 拡張ライブラリを含む優れた PHP パッケージが http://www.php4win.de にあります。ダウンロードして解凍し、readme.first ドキュメントの指示に従ってインストールするだけです。
マッシュを使用する
情報の混合は非常に簡単です。以下の例を見てください:
$hash_alg = MHASH_TIGER;
$message = "秘密の砦への道順です。左に 2 歩、右に 3 歩、チャチャチャです。";
$hashed_message = mhash($hash_alg, $message);
print "ハッシュ化されたメッセージは ".bin2hex($hashed_message);
>
このスクリプトを実行すると、次の出力が得られます:
ハッシュされたメッセージは 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 です
ここで bin2hex() 関数を使用する目的は、$hashed_message の出力を理解しやすくすることです。これは、混合結果を理解しやすい形式に変換する必要があるためです。 16 進形式に変換されます。
シャッフルは一方向関数であり、その結果は入力に依存しないため、この情報は公開できることに注意することが重要です。このポリシーは通常、ユーザーがダウンロードしたファイルとシステム管理者が提供したファイルを比較してファイルの整合性を確保できるようにするために使用されます。
Mhash には他にも便利な機能がいくつかあります。たとえば、Mhash でサポートされているアルゴリズムの名前を出力する必要があります。Mhash でサポートされているすべてのアルゴリズムの名前は MHASH_ で始まるため、このタスクは次のコードを実行することで完了できます。
$hash_alg = MHASH_TIGER;
print "このデータは、".mhash_get_hash_name($hashed_message)." ハッシュ アルゴリズムでハッシュされています。";
>
結果の出力は次のようになります:
このデータは TIGER ハッシュ アルゴリズムでハッシュ化されています。
PHP と暗号化について最後に注意すべき点が 1 つあります
PHP と暗号化に関して注意すべき最後の重要な点は、サーバーとクライアントの間で転送されるデータは転送中に安全ではないということです。 PHP はサーバー側のテクノロジーであるため、送信中のデータ漏洩を防ぐことはできません。したがって、完全に安全なアプリケーションを実装したい場合は、Apache-SSL またはその他の安全なサーバー構成を使用することをお勧めします。
この記事では、PHP の最も便利な機能の 1 つであるデータ暗号化について紹介します。PHP の組み込みの crypt() および md5() 暗号化関数について説明するだけでなく、データ暗号化用の強力な拡張ライブラリである Mcrypt および Mhash についても説明します。この記事の最後に、真に安全な PHP アプリケーションには安全なサーバーも含める必要があることを指摘しておく必要があります。PHP はサーバー側のテクノロジであるため、データのセキュリティを確保することはできません。