ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルの暗号化関数

PHP_PHP チュートリアルの暗号化関数

WBOY
WBOYオリジナル
2016-07-21 16:09:55660ブラウズ


特にインターネット上で大量のトランザクションが発生し、大量のデータが送信されることを考えると、データ暗号化は私たちの生活においてますます重要になっています。セキュリティ対策の導入に興味がある場合は、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 $1$で始まる12文字 CRYPT_BLOWFISH $2$で始まる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 文字に基づいて干渉文字列を作成したためです。 $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 = "localhost";
$user = "zorro";
$pswd = "hellodolly";
$db = "users";

// 認証を False に設定します

$authorization = 0;

// ユーザーがユーザー名とパスワードを入力したことを確認します

if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) :

mysql_pconnect($host, $user, $pswd) または die("Can' 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;

endif;

// 認可を確認します

if (! $authorization) :

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() を使用して文字列を混合する $msg = "これは私が今書いたメッセージです";
$enc_msg = md5($msg);
print "ハッシュ: $enc_msg ";
?> 結果: ハッシュ: 81ea092649ca32b5ba375e81d8f4972c 結果の長さは 32 文字であることに注意してください。次の表をもう一度見てください。$msg の値がわずかに変更されています。 md5() を使用して、わずかに変更された文字列をシャッフルする //メッセージに 1 つ欠けていることに注意してください
$msg = "これは私が今書いたメッセージです";
$enc_msg = md5($msg);
print "hash2: $enc_msg < ;br />gt;
";
?> 結果: ハッシュ 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 を使用してデータの追加、解読を実行する
// 暗号化する文字列を指定します
$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";

?> 上のスクリプトを実行すると、次の出力が生成されます。 元の文字列: Bruce Schneier 著の『Applied Cryptography』は、素晴らしい暗号化リファレンスです。 暗号化された文字列: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc9ea24850478c1 1742f5cfa1d23fe22fe8 bfbab5e Bruce Schneier 著の『復号化された文字列: Applied Cryptography』は、素晴らしい暗号化リファレンスです。     上記のコードの 2 つの最も典型的な関数は mcrypt_encrypt() と mcrypt_decrypt() であり、これらの使用法は容易に理解できます。暗号化の安全に影響を与える可能性のある特定の文字があるため、各モードで理解する必要があります。 暗号化システムと接触しないユーザーにとっては、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 。/構成、設定 作る インストールする cd ./configure -with-mhash=[dir] [--other-configuration-directives] 作る インストールする     オブジェクト Mcrypt と同様に、PHP の相互ネットワーク サーバー コンポーネントへのインストール方法に応じて、Mhash に追加の構成が必要になる場合があります。     Windows ユーザーの場合は、http://www.php4win.de に Mhash 展開が含まれる優れた PHP パッケージが含まれています。ダウンロードして解凍し、その中の readme.first 文にある指示に従ってください。すぐに取り付けを行ってください。 Mhashを使用する     情報は非常に複雑に混ざっています。次の例を参照してください。 $hash_alg = MHASH_TIGER;
$message = "秘密の砦への道順です。左に2歩、右に3歩、チャチャチャです。";
$hashed_message = mhash($hash_alg, $message) ;
print "ハッシュ化されたメッセージは " です。 bin2hex($hashed_message);
?>     この段階のスクリプトを実行すると次の出力結果が得られます: ハッシュされたメッセージは 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 です      ここでの bin2hex() 関数の目的は、$hashed_message の出力を理解することです。これは、混同された結果が二重形式であるため、理解しやすい形式に変換するには、十六形式に変換する必要があります。 。     このポリシーは通常、ユーザーがダウンロードしたファイルとシステム管理者が提供するファイルを比較して、ファイルの完全性を保証するために使用されるものであることに注意してください。性。      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 はサーバー側のテクノロジであるため、データのセキュリティを確保することはできません。

www.bkjia.com本当http://www.bkjia.com/PHPjc/314399.html技術記事特にインターネット上で大量のトランザクションが発生し、大量のデータが送信されることを考えると、データ暗号化は私たちの生活においてますます重要になっています。安全対策にご興味のある方は...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。