最近、パスワードハッシュとデータ暗号化について SO でよく読んでいます。つまり、ベストプラクティスを決定するのは本当に混乱しています。どこでも再利用でき、PHP アプリケーションにまともなセキュリティ レベルを提供する非常に単純なクラスが必要です (私は銀行データを処理しません)。さらに、PHP 標準ライブラリにできるだけ依存したいと考えています。私はこれを思いつきました:
class Security {
public static function hashPassword($plain) {
$salt = md5(rand(0, 1023) . '@' . time()); // Random salt
return crypt($plain, '$2a$07$' . $salt); // '$2a$07$' is the Blowfish trigger
}
public static function checkPassword($plain, $hash) {
return (crypt($plain, $hash) === $hash);
}
public static function generateIv() {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); // It's 32
return mcrypt_create_iv($iv_size, MCRYPT_RAND);
}
public static function encrypt($key, $data, $iv = null, $base64 = true) {
if (is_null($iv)) $iv = md5($key);
$ret = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
return ($base64 ? base64_encode($ret) : $ret);
}
public static function decrypt($key, $data, $iv = null, $base64 = true) {
if (is_null($iv)) $iv = md5($key);
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $base64 ? base64_decode($data) : $data, MCRYPT_MODE_CBC, $iv), "\0");
}
}
ご覧のとおり、Blowfish ハッシュ アルゴリズムcrypt()
を使用してパスワードをハッシュすることにしました。の戻り値は、DB に保存するソルト + ハッシュです。私がこの選択をしたのは、すべてのサーバーで利用可能であり、使用されるアルゴリズムに関係なくハッシュをチェックする快適な方法を提供し (salt プレフィックスに基づいています)、bcryptは適切なハッシュ方法であると読んだためです。hashPassword()
crypt()
次に、データの暗号化には、Rijndael 256アルゴリズムとCBC モードを使用しました。ご覧のとおり、暗号化方法は 2 つの方法で使用できます。暗号化されたデータとともに DB に保存する IV を渡すことができます (そして IVを作成するのに役立ちます)。そうしない場合、基本的な IV は暗号化と復号化の両方のプロセスでキーから派生します。mcrypt()
generateIv()
あなたはそれについてどう思いますか?何か不足していますか?PHP アプリケーションでのハッシュと暗号化について、やっと安心できるでしょうか?!?