データ暗号化は、特にインターネット上で発生する多数のトランザクションと送信される大量のデータを考慮すると、私たちの生活の中でますます重要になっています。セキュリティ対策の導入に興味がある場合は、PHP が提供する一連のセキュリティ機能について学ぶことにも興味があるでしょう。今回は、アプリケーションソフトにセキュリティ機能を追加できるよう、これらの機能の紹介と基本的な使い方を紹介します。
予備知識
PHP のセキュリティ機能を詳しく紹介する前に、この側面についてまだよく知っている読者向けに、暗号化に関する基本的な知識を紹介するために時間を割く必要があります。暗号化については、この部分は省略できます。
暗号動物学は、暗号化/復号化の研究と実験として一般的に説明できます。暗号化は、理解しやすいデータを理解しにくいデータに変換するプロセスであり、復号化は、理解しにくいデータをデータに変換するプロセスです。わかりやすいオリジナルデータ。わかりにくい情報をコード、理解しやすい情報を明確なコードといいます。
データの暗号化/復号化には特定のアルゴリズムが必要です。これらのアルゴリズムは、有名なシーザー コードなど、非常に単純なものもありますが、現在の暗号化アルゴリズムは比較的複雑で、既存の方法では解読できないものもあります。
PHP の暗号化関数
Windows 以外のプラットフォームの使用経験が少しある人は、crypt() にも精通しているかもしれません。これは、一部のプレーン コードを暗号化することはできますが、暗号化することはできません。パスワードは元のクリアコードに変換されます。これは一見役に立たない機能のように見えるかもしれませんが、システム パスワードの整合性を確保するために広く使用されています。一方向暗号化されたパスワードは、第三者の手に渡ると平文に戻すことができないため、ほとんど役に立ちません。ユーザーが入力したパスワードを検証するときも、ユーザーの入力は一方向アルゴリズムを使用します。入力が保存されている暗号化されたパスワードと一致する場合、入力されたパスワードは正しい必要があります。
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 $ で始まる 12 文字
CRYPT_BLOWFISH $ で始まる 16 文字
crypt() を使用してユーザー認証を実装します
crypt() 関数の例として、ディレクトリへのアクセスを、このディレクトリにアクセスするための正しいユーザー名とパスワード。私のお気に入りのデータベースである MySQL のテーブルにデータを保存します。 members というテーブルを作成することから例を始めましょう:
mysql>CREATE TABLE members (
->username CHAR(14) NOT NULL,
->password CHAR(32) NOT NULL,
->PRIMARY KEY (username)
- >);
次に、次のデータがテーブルに保存されていると仮定します:
ユーザー名とパスワード
clark keloD1C377lKE
bruce ba1T7vnz9AWgk
peter paLUvRWsRLZ4U
これらの暗号化されたパスワードに対応するプレーンコードは、kent、banner、parker です。各パスワードの最初の 2 文字に注意してください。これは、パスワードの最初の 2 文字に基づいて干渉文字列を作成するために、
$salt = substr($enteredPassword, 0, 2) を使用したためです。 ) ;
$userPswd = crypt($enteredPassword, $salt);
// $userPswd はユーザー名とともに MySQL に保存されます
Apache のパスワード応答認証設定を使用して、ユーザーにユーザー名とパスワードの入力を求めますあまり知られていない PHP について知られているのは、Apache のパスワード応答システムによって入力されたユーザー名とパスワードを、認証スクリプトで使用する $PHP_AUTH_USER および $PHP_AUTH_PW として認識するということです。次のコードをよりよく理解するために、時間をかけて以下のスクリプトを注意深く読み、説明にもっと注意を払ってください:
crypt() と Apache のパスワード応答検証システムのアプリケーション
$host = "localhost" ;
$user = "zorro";
$db = "users";
// ユーザーがユーザー名とパスワードを入力したことを確認します。
if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) :
mysql_pconnect($host, $user, $pswd) または die("MySQL
server に接続できません!");
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"'); 401 Unauthorized');
print "このエリアへのアクセスは許可されていません。";
else :
endif?>
上記はユーザーのアクセスを確認します。権利 簡単な認証システム。重要な機密情報を保護するために crypt() を使用する場合は、デフォルトで使用される crypt() が最も安全ではなく、より高いセキュリティ要件が必要な場合にのみ使用できることに注意してください。パフォーマンスには、この後で紹介するアルゴリズムが必要です。記事。
次に、PHP━━md5() でサポートされている別の関数を紹介します。この関数は、MD5 ハッシュ アルゴリズムを使用します。これには、言及する価値のあるいくつかの興味深い用途があります。
ハッシュライティング
混合関数は、可変長メッセージを固定長のハッシュされた出力。「メッセージ ダイジェスト」とも呼ばれます。これは、固定長の文字列を使用してファイルの整合性をチェックし、デジタル署名とユーザー認証を検証できるため便利です。 PHP に適しているため、PHP の組み込み md5() ハッシュ関数は、可変長メッセージを 128 ビット (32 文字) のメッセージ ダイジェストに変換します。混合エンコーディングの興味深い特徴は、混合結果が元のプレーン コードの内容に依存しないため、混合情報を分析しても元のプレーン コードを取得できないことです。 文字列内の 1 文字だけを変更した場合でも、MD5 ハイブリッド アルゴリズムは 2 つのまったく異なる結果を計算します。まず、次の表の内容とそれに対応する結果を見てみましょう。
md5() を使用して文字列を混合します
$msg = "This is some message that I just writing"
$enc_msg = md5($; msg);
print "hash: $enc_msg "; ?> Result:
hash: 81ea092649ca32b5ba375e81d8f4972c
結果の長さは 32 文字であることに注意してください。以下の表を見てみましょう。 $msg の値がわずかに変更されています:
少し変更された文字列をミックスするには md5() を使用します
//メッセージに 1 つ欠けていることに注意してください
$msg = "これは私がたった今書いたメッセージです";
$enc_msg = md5($msg);
print "hash2: $enc_msg
";
?>
結果:
hash2: e86cf511bd5490d46d5cd61738c82c 0c
は見つかりますが、どちらの結果の長さも 32 文字であるため、平文の小さな変更が結果に大きな変化をもたらすため、ハッシュ関数と md5() 関数はデータの小さな変更を確認するのに適したツールです。
crypt() と md5() には独自の用途がありますが、どちらも機能に特定の制限があります。次のセクションでは、PHP ユーザーの暗号化オプションを大幅に拡張する、Mcrypt と Mhash という 2 つの非常に便利な PHP 拡張機能を紹介します。
上記のセクションでは一方向暗号化の重要性について説明しましたが、暗号化後にパスワード データを元のデータに復元する必要がある場合があります。幸いなことに、PHP はこれを Mcrypt 拡張ライブラリの形式で提供します。
Mcrypt
Mcrypt 2.5.7 Unix | Win32
Mcrypt 2.4.7 は、次のアルゴリズムを含む 22 のアルゴリズムを含む強力な暗号化アルゴリズム拡張ライブラリです:
Blowfish RC2 Safer-sk64 xtea
Cast -256 RC4 Safer-sk128
Enigma Rijndael-128 Threeway
Gost Rijndael-192 TripleDES
LOKI97 Rijndael-256 Twofish
PanamaSaferplus Wake
インストール:
標準PHでは、McryptはPパッケージに含まれていないため、ダウンロードする必要がありますダウンロードアドレスは: