開発プロセス中に、特にデータベースパスワード、APIキーなどの機密情報に関しては、構成ファイルの整合性とセキュリティを確保することが非常に重要です。PHPは、主にパスワード暗号化に使用される組み込み関数Crypt()を提供しますが、ファイルコンテンツの完全性を確認するのに役立つために使用することもできます。この記事では、PHPのCrypt()関数を使用してこの関数を実装する方法を詳細に紹介し、実際のコード例を組み合わせて特定の操作を実証します。
crypt()は、文字列を暗号化するためにPHPで使用される関数であり、パスワードハッシュによく使用されます。さまざまな暗号化アルゴリズム(DES、BlowFish、SHA-256、SHA-512など)をサポートし、塩値を指定することでセキュリティを増やすことができます。ファイルの整合性検証用に特別に設計されていませんが、その不可逆性と塩の値メカニズムを備えたものですが、それを使用して構成ファイルのハッシュ値を生成し、その後の検証中にそれらを比較できます。
不気期性: Crypt()によって生成されるハッシュは不可逆的であり、ファイルコンテンツのセキュリティを確保します。
塩の価値メカニズム:単純なハッシュによる衝突の問題を回避するために、ハッシュの独自性とセキュリティ強度を高めます。
組み込みサポート:PHPは組み込まれており、追加の拡張機能は必要ありません。展開しやすいです。
構成ファイルの内容を読み取ります。
コンテンツのハッシュ値を生成します( crypt()を使用して塩値を保存します)。
ハッシュ値を安全な場所(データベースまたは個別のファイル)に保存します。
後で検証するときは、構成ファイルのコンテンツをもう一度読み取り、ハッシュ値を生成し、保存されたハッシュ値と比較します。
ハッシュ値が一貫している場合、構成ファイルが改ざんされていないことを意味します。それ以外の場合、ファイルが変更される可能性があることを示します。
<?php
// 構成ファイルパス
$configFile = 'config.ini';
// 構成ファイルコンテンツを読み取ります
$configContent = file_get_contents($configFile);
if ($configContent === false) {
die("構成ファイルを読み取れません。");
}
// 塩値を生成します(例えば Blowfish アルゴリズム,塩の長さはです22)
$salt = '$2y$12$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
// ハッシュ値を生成します
$hash = crypt($configContent, $salt);
// ハッシュ値を安全なファイルに保存します
file_put_contents('config_hash.txt', $hash);
echo "構成ファイルハッシュが生成され、保存されています。\n";
// -------------- 検証フェーズ --------------
// 重新構成ファイルコンテンツを読み取ります
$newContent = file_get_contents($configFile);
if ($newContent === false) {
die("構成ファイルを読み取れません。");
}
// 保存したハッシュを読んでください
$savedHash = file_get_contents('config_hash.txt');
if ($savedHash === false) {
die("无法保存したハッシュを読んでください值。");
}
// Saved Hashを塩値として使用して、新しいコンテンツを暗号化します
$newHash = crypt($newContent, $savedHash);
// ハッシュ値を2回比較します
if (hash_equals($savedHash, $newHash)) {
echo "構成ファイルの整合性検証が合格しました,改ざんされていません。\n";
} else {
echo "構成ファイルの整合性の確認に失敗しました,ファイルコンテンツが変更された可能性があります!\n";
}
?>
これは、 crypt()関数の特性を活用します。2番目のパラメーターが既存のハッシュである場合、 crypt()は同じ塩値を使用して新しいハッシュを生成します。
Hash_equals()は、タイミング攻撃を防ぎ、ハッシュ文字列を安全に比較するために使用されます。
ハッシュ値をデータベースまたは他の安全なストレージメディアに保存して、簡単に変更されないようにすることができます。
crypt()は複数のアルゴリズムをサポートします。上記の例では、BlowFish( $ 2Y $ )アルゴリズムを使用しています。必要に応じて他のアルゴリズムを選択することもできますが、塩値形式は対応する必要があります。
構成ファイルの許可設定と組み合わせて、セキュリティを改善します。
特に自動展開後、定期的に構成ファイルを確認します。
ログシステムと組み合わせて、各検証の結果を記録します。