暗号化|データ
特に、大量のトランザクションが発生し、インターネット上で送信される大量のデータを考慮すると、データ暗号化は私たちの生活においてますます重要になっています。セキュリティ対策の導入に興味がある場合は、PHP が提供する一連のセキュリティ機能について学ぶことにも興味があるでしょう。今回は、アプリケーションソフトにセキュリティ機能を追加できるよう、これらの機能の紹介と基本的な使い方を紹介します。
予備知識
PHP のセキュリティ機能を詳しく紹介する前に、この側面についてまだよく知っている読者に、暗号化に関する基本的な知識を紹介するために少し時間を割く必要があります。暗号化の概念については、この部分をスキップしてください。
暗号動物学は、暗号化/復号化の研究と実験として一般に説明できます。暗号化は、理解しやすいデータを理解しにくいデータに変換するプロセスであり、復号化は、理解しにくいデータを変換するプロセスです。わかりやすいオリジナルデータ化。理解しにくい情報を暗号、理解しやすい情報を平文と呼びます。
データの暗号化/復号化には特定のアルゴリズムが必要です。これらのアルゴリズムは、有名なシーザー コードなど、非常に単純なものもありますが、現在の暗号化アルゴリズムは比較的複雑で、既存の方法では解読できないものもあります。
PHP の暗号化関数
Windows 以外のプラットフォームの使用経験が少しある人であれば、この関数は一方向暗号化と呼ばれる関数を完成させることができますが、一部のプレーン コードを暗号化することはできません。パスワードを元のクリアコードに変換します。これは一見役に立たない機能のように見えるかもしれませんが、システム パスワードの整合性を確保するために広く使用されています。一方向暗号化されたパスワードは、第三者の手に渡ると平文に戻すことができないため、ほとんど役に立ちません。ユーザーが入力したパスワードを検証するときも、ユーザーの入力は一方向アルゴリズムを使用します。入力が保存されている暗号化されたパスワードと一致する場合、入力されたパスワードは正しい必要があります。
PHP は、crypt() 関数を使用して一方向暗号化を完了する機能も提供します。ここで関数を簡単に紹介します:
string crypt (string input_string [, string Salt])
input_string パラメータは暗号化する必要がある文字列で、2 番目のオプションの Salt はビット文字列で、これはパスワードに影響を与える可能性があります。暗号化により、いわゆる事前計算攻撃の可能性がさらに排除されます。デフォルトでは、PHP は 2 文字の DES 干渉文字列を使用します。システムで MD5 (MD5 アルゴリズムについては後で紹介します) を使用する場合は、12 文字の干渉文字列が使用されます。ちなみに、システムが使用する干渉文字列の長さは、次のコマンドを実行することで確認できます:
print "My system Salt size is: ". システムは他の暗号化アルゴリズムもサポートしている場合があります。 crypt() は 4 つのアルゴリズムをサポートします。サポートするアルゴリズムと、対応するソルト パラメーターの長さは次のとおりです。
アルゴリズム ソルトの長さ
CRYPT_STD_DES 2 文字 (デフォルト)
CRYPT_EXT_DES 9 文字
CRYPT_MD5 $1$ で始まる 12 文字
CRYPT_BLOWFISH $2$ で始まる 16 文字
crypt() を使用してユーザー認証を実装します
crypt() 関数の例として、ディレクトリへのアクセスを制限する PHP スクリプトを作成する状況を考えてみましょう。正しいユーザー名とパスワードを提供できるユーザーのみが、このディレクトリへのアクセスを許可されます。私のお気に入りのデータベース MySQL のテーブルにデータを保存します。 members というテーブルを作成することから例を始めましょう:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
- >PRIMARY KEY( username)
->);
次に、次のデータがテーブルに格納されているとします:
Username Password
clark keloD1C377lKE
bruceba1T7vnz9AWgk
peterpaLUvRWsRLZ4U
これらの暗号化されたパスワード対応 クリアコードはケントされており、それぞれバナーとパーカー。各パスワードの最初の 2 文字に注意してください。これは、
$enteredPassword というコードを使用して干渉文字列を作成したためです。 2 ; PHP についてあまり知られていない事実は、PHP は Apache のパスワード応答システムによって入力されたユーザー名とパスワードを $PHP_AUTH_USER および $PHP_AUTH_PW として認識するということです。これを認証スクリプトで使用します。以下のコードをよりよく理解するために、時間をかけて以下のスクリプトを注意深く読み、説明に注意してください:
crypt() と Apache のパスワード応答検証システムのアプリケーション
$host = "localhost"
$user = "ゾロ";
$pswd = "ユーザー";
// 認証を False に設定します
$authorization = 0;// ユーザーがユーザー名とパスワードを入力したことを確認します
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) :
mysql_pconnect($host, $user, $pswd) or die("MySQL に接続できません
サーバー!");
mysql_select_db($db) または die("データベースを選択できません!");
// 暗号化を実行します
$salt = substr($PHP_AUTH_PW, 0, 2);
$encrypted_pswd = crypt($PHP_AUTH_PW, $salt);
// クエリを構築します
$query = "SELECT username FROM members WHERE
username = '$PHP_AUTH_USER' AND
password = '$encrypted_pswd'";
// クエリを実行します
if (mysql_numrows(mysql_query($query)) == 1) :
$authorization = 1;
終わり;
endif;
// 認可を確認する
if (! $authorization) :
header('WWW-Authenticate: Basic realm="Private"');
header('HTTP/1.0 401 Unauthorized');
print "このエリアへの立ち入りは許可されていません。";
終了;
else :
print "これは秘密データです!";
endif;
?>
上は、コアのユーザーが制限を設けるための個別認証システムです。 crypt() を使用して保護する必要がある場合、節約状態で使用される crypt() は最も安全ではなく、安全性の要求が低いシステムで、より高い安全性が必要な場合は、このセクションの後半で、PHP でサポートされる別の関数━━md5() を使用します。関数数は MD5 散列計算法を使用し、非常に興味深い使用法を実現します。これは、「情報テキスト クリップ」とも呼ばれます。固定長の文字列がファイルの完全性を検査したり、デジタル ネームやユーザーの認証に使用できるため、非常に役立ちます。PHP 内にある md5( ) ミックス関数は、長さを変更できる情報を 128 ビット (32 文字) の情報テキストに変換します。その結果は、元のコードの内容とは無関係です。つまり、1 つの文字列の 1 つの文字を変更するだけでも、MD5 混同計算法を使用して 2 つの異なる結果を計算します。結果:
usemd5()混编字符串
$msg = "これは私が今書いたメッセージです";
$enc_msg = md5($msg);
print "ハッシュ: $enc_msg ";
?>
結果:
ハッシュ: 81ea092649ca32b5ba375e81d8f4972c
注意、結果の長さは 32 文字です。以下の表を参照してください。その中の $msg の値にはわずかな変更が含まれています
m d5()对一稍微变化的文字符串行混编
//注意,メッセージ中少了一个s
$msg = "これは私がたった今書いたメッセージです";
$enc_msg = md5($msg);
print "hash2: $enc_msg
";
?>
結果:
hash2: e86cf511bd5490d46d5cd61738c82c0c
可発行、尽管二個の結果の長さ都は32文字、ただし明文中の一点微小の変更により結果が発生しました変化、したがって、混合と md5() 関数
crypt() と md5() はいずれも有用ですが、どちらも機能的に制限されています。 Mcrypt および Mhash として知られる非常に有用な PHP の拡張は、保護の面で PHP ユーザーの選択肢を大きく広げます。その後、暗号化データが再度変換されますが、PHP は、Mcrypt 拡張機能を介してこのような可能性のある特性を提供します。 Win32
Mcrypt 2.4.7 は機能拡張の 1 つであり、22 の演算法が含まれており、その中には以下の演算法が含まれています:
Blowfish RC2 Safer-sk64 xtea
Cast-256 RC4 Safer-sk128
DES RC4-iv Serpent
Enigma Rijndael-128 Threeway
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 Twofish
PanamaSaferplus Wake
インストール:
標準の PHP パッケージには Mcrypt が含まれていないため、以下が必要ですダウンロード、ダウンロードの地址ダウンロード後、次の方法に従って認証が行われ、PHP 内に格納されます:
DownloadMcrypt パッケージ。
gunzipmcrypt-x.x.x. tar.gz
tar -xvfmcrypt-x.x.x.tar
./configure --disable-posix-threads
make
make install
cd を PHP ディレクトリに実行します。
./configure -with-mcrypt=[dir] [--other-configuration-directives]
make
make install
当然のことながら、你の要求と PHP のインストール時に相互联网サービス务器软件の関係、上の手順が可能です適切な修正が必要です。
Mcrypt を使用してください
Mcrypt の利点は、多くの暗号化アルゴリズムを提供するだけでなく、データを暗号化/復号化できることです。さらに、データを処理するための 35 の関数も提供します。これらの関数の詳細についてはこの記事の範囲を超えていますが、代表的な関数をいくつか簡単に紹介します。
まず、Mcrypt 拡張ライブラリを使用してデータを暗号化する方法と、それを使用して復号化する方法を紹介します。次のコードは、最初にデータを暗号化し、次に暗号化されたデータをブラウザ上に表示し、暗号化されたデータを元の文字列に復元して、ブラウザ上に表示します。
データの暗号化と復号化には Mcrypt を使用します
// 暗号化する文字列を指定します
$string = "Applied Cryptography (Bruce Schneier 著) は、
素晴らしい暗号化リファレンスです。"; 暗号化/復号化キー
$ key = "4 スコアと 20 年前";
// 暗号化アルゴリズム
$cipher_alg = MCRYPT_RIJNDAEL_128;
// セキュリティを強化するための初期化ベクトルを作成します
$iv = mcrypt_get_iv_size($cipher_alg,
MCRYPT_MODE_EC) B)、 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";
?>
上記のスクリプトを実行すると、次の出力が生成されます:
元の文字列: Bruce Schneier による Applied Cryptography は、素晴らしい暗号化リファレンスです。暗号化された文字列: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc 9ea24850478c 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/
Mhash 拡張ライブラリの 0.8.3 バージョンは 12 の混合アルゴリズムをサポートしています。Mhash v.0.8.3 のヘッダー ファイル mhash を注意深く確認してください。 h 次のハイブリッド アルゴリズムをサポートしていることがわかります:
CRC32 HAVAL160 MD5
CRC32B HAVAL192 RIPEMD160
GOST HAVAL224 SHA1
HAVAL128 HAVAL256 TIGER
インストール
Mcrypt のように、Mhash はサポートされていません。 PHP ソフトウェア パッケージに含まれています。 - Windows ユーザーの場合、インストール プロセスは次のとおりです:
Mhash 拡張ライブラリをダウンロード
gunzipmhash-x.x.x.tar.gz
tar -xvfmhash-x.x.x.tar
./configure
make
make install
cd
./configure -with -mhash= [dir] [--other-configuration-directives]
make
make install
Mcrypt と同様に、インターネット サーバー ソフトウェアへの PHP のインストール方法によっては、Mhash の追加の設定が必要になる場合があります。
Windows ユーザーの場合、Mhash 拡張ライブラリを含む優れた PHP パッケージが http://www.php4win.de にあります。ダウンロードして解凍し、readme.first ドキュメントの指示に従ってインストールするだけです。
Mhash
を使用してメッセージをハッシュするのは非常に簡単です。以下の例を見てください:
$hash_alg = MHASH_TIGER;
$message = "これらは秘密の砦への道順です。残り 2 歩、3 歩です右にステップして、チャチャチャ。";
$hashed_message = mhash($hash_alg, $message);
print "ハッシュされたメッセージは ". bin2hex($hashed_message);
?>
このスクリプトを実行すると、次の結果が得られます出力結果:
ハッシュされたメッセージは 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 です。
ここで bin2hex() 関数を使用する目的は、ハッシュの結果がバイナリ形式であるためです。理解しやすい形式に変換する必要があります。16 進数形式に変換する必要があります。
シャッフルは一方向関数であり、その結果は入力に依存しないため、この情報は公開できることに注意することが重要です。このポリシーは通常、ユーザーがダウンロードしたファイルとシステム管理者が提供したファイルを比較して、ファイルの整合性を確保できるようにするために使用されます。
Mhash には他にも便利な機能がいくつかあります。たとえば、Mhash でサポートされているアルゴリズムの名前を出力する必要があります。Mhash でサポートされているすべてのアルゴリズムの名前は MHASH_ で始まるため、このタスクは次のコードを実行することで完了できます。
$hash_alg =
print "このデータは、".mhash_get_hash_name($hashed_message)." ハッシュ アルゴリズムでハッシュ化されています。";
?>
得られる出力は次のとおりです:
このデータは TIGER ハッシュ アルゴリズムでハッシュ化されています。
PHP と暗号化について最後に注意すべき問題が 1 つあります
PHP と暗号化に関して注意すべき最後の重要な問題は、サーバーとクライアントの間で転送されるデータは送信中に安全ではないということです。 PHP はサーバー側のテクノロジーであるため、送信中のデータ漏洩を防ぐことはできません。したがって、完全に安全なアプリケーションを実装したい場合は、Apache-SSL またはその他の安全なサーバー構成を使用することをお勧めします。
結論
この記事では、PHP━━データ暗号化の最も便利な機能の 1 つを紹介します。PHP の組み込みの crypt() および md5() 暗号化関数について説明するだけでなく、強力な crypt() および md5 についても説明します。 () データ暗号化に使用される暗号化関数━━Mcrypt および Mhash。この記事の最後に、真に安全な PHP アプリケーションには安全なサーバーも含める必要があることを指摘しておく必要があります。PHP はサーバー側のテクノロジであるため、データのセキュリティを確保することはできません。
出典: ライジング