にパスワードを確認するために私はここに二つの質問があります。はどのように以下のコード
をそれが正常にランダムな文字列を生成するための
openssl_random_pseudo_bytes()
を使用しているか、/dev/random
から直接文字列を取ることだけで良いですか?パスワードを確認するにはどうすればよいですか?私はハッシュが塩の存在のためにランダムなので、どのように認可するのか混乱しています。 1については
にパスワードを確認するために私はここに二つの質問があります。はどのように以下のコード
をそれが正常にランダムな文字列を生成するためのopenssl_random_pseudo_bytes()
を使用しているか、/dev/random
から直接文字列を取ることだけで良いですか?
パスワードを確認するにはどうすればよいですか?私はハッシュが塩の存在のためにランダムなので、どのように認可するのか混乱しています。 1については
:こちらを参照してください:https://security.stackexchange.com/a/101117
をそれはあなたが探しているものを完璧に答えます。
2の場合:パスワードを確認します。まず、塩を点検する必要があるので、塩をどこかに保管する必要があります。それから3つの関数を作り直してください:
function getSalt($length = 33) {
return openssl_digest(openssl_random_pseudo_bytes($length), 'sha512')
. openssl_digest('intercept9', 'sha512');
}
function encrypt($salt, $password) {
$password = md5($pass . $salt);
return $password;
}
function verify($salt, $password, $hash) {
return encrypt($salt, $password) == $hash;
}
$salt = getSalt();
$hash = encrypt($salt, 'root');
var_dump(verify($salt, 'root', $hash));
しかし、すでに実装されているpassword_ *関数に頼ってみてください。
単に塩でハッシングするだけでは不十分です。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 password_hash、PBKDF2、Bcryptなどの関数を使用します。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph
@zaphはい私はあなたに同意します**キーストレッチ**はあなたが話しているものです。 10000ユーザーのサイトがあると想像する人すべてにそうし、サーバーの帯域幅はそれほどありません。ログインの機能を損なうことは大変ですか? – StackB00m
キーストレッチではなく、PBKDF2などのキー導出機能を使用することもできますが、重要な繰り返しです。 100msが許容できない場合、より短い持続時間は、1ハッシュあたり1μsよりずっと優れています。 1us * 10Kユーザー* 10K最も一般的なパスワード= 100s、それは受け入れられないし、我々は簡単により良い保護を提供することができます。攻撃者がハッシュハードウェアを10〜1000倍高速化していると仮定します。 – zaph
ログインする場合は、 'password_hash()'と 'password_verify()'を使用してください。私は車輪を再発明しようとはしません。 – Rasclatt
私はすでに** password_hash()**がどのように動作しているか知りたいだけです。 – StackB00m
動作の仕方を知りたい場合は、そのソースを確認してください。https://github.com/php/php-src/ blob/master/ext/standard/password.c#L261 – zerkms