2016-08-06 15 views
2

にパスワードを確認するために私はここに二つの質問があります。はどのように以下のコード

  1. をそれが正常にランダムな文字列を生成するためのopenssl_random_pseudo_bytes()を使用しているか、/dev/randomから直接文字列を取ることだけで良いですか?

  2. パスワードを確認するにはどうすればよいですか?私はハッシュが塩の存在のためにランダムなので、どのように認可するのか混乱しています。 1については

+2

ログインする場合は、 'password_hash()'と 'password_verify()'を使用してください。私は車輪を再発明しようとはしません。 – Rasclatt

+0

私はすでに** password_hash()**がどのように動作しているか知りたいだけです。 – StackB00m

+2

動作の仕方を知りたい場合は、そのソースを確認してください。https://github.com/php/php-src/ blob/master/ext/standard/password.c#L261 – zerkms

答えて

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_ *関数に頼ってみてください。

+0

単に塩でハッシングするだけでは不十分です。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 password_hash、PBKDF2、Bcryptなどの関数を使用します。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

+0

@zaphはい私はあなたに同意します**キーストレッチ**はあなたが話しているものです。 10000ユーザーのサイトがあると想像する人すべてにそうし、サーバーの帯域幅はそれほどありません。ログインの機能を損なうことは大変ですか? – StackB00m

+1

キーストレッチではなく、PBKDF2などのキー導出機能を使用することもできますが、重要な繰り返しです。 100msが許容できない場合、より短い持続時間は、1ハッシュあたり1μsよりずっと優れています。 1us * 10Kユーザー* 10K最も一般的なパスワード= 100s、それは受け入れられないし、我々は簡単により良い保護を提供することができます。攻撃者がハッシュハードウェアを10〜1000倍高速化していると仮定します。 – zaph

関連する問題