1a) 暗号化の強度 - 4..31 の範囲の要件。http://php.net/manual/en/function.crypt.phpを参照してください
1b) 1aを参照
1c) 1a を参照。「salt」はランダムであってはなりません。そうしないと、特定の入力に対して同じハッシュを再生成できなくなります - 3 を参照してください。
2a) 厳密に言えば、ハッシュを除くすべて (データベースが侵害された場合)。また、Web サーバーのドキュメント ルートの下にアクセスできないファイルにソルトを保存し、それを含めます。可能な限り厳格な権限で設定してください。理想的には、Web ホスト サービス (例: apache) に対して読み取り専用で、書き込み権限も実行権限もありません。厳密に言えば、ハッカーに対してどれだけ防御したいかによって異なります。塩を保管しないと、生活がより困難になります。アルゴリズムに入力されるデータを正しく取得する必要がありますが、なぜ簡単にする必要があるのでしょうか。
2b) ハッシュを保存しない場合、フグには VARCHAR(32) で問題ありません。
3) 適切なインジェクション防止コードなどを既に実行していると仮定します。したがって、以下を盲目的にコピーしないでください(理想的には、mysql 拡張機能の代わりに PDO を使用します)。以下はフグ、SHA-256、および SHA-512 に固有のもので、これらはすべてハッシュ内のソルトを返します。他のアルゴリズムには変更が必要です...
//store this in another file outside web directory and include it
$salt = '$2a$07$somevalidbutrandomchars$'
...
//combine username + password to give algorithm more chars to work with
$password_hash = crypt($valid_username . $valid_password, $salt)
//Anything less than 13 chars is a failure (see manual)
if (strlen($password_hash) < 13 || $password_hash == $salt)
then die('Invalid blowfish result');
//Drop the salt from beginning of the hash result.
//Note, irrespective of number of chars provided, algorithm will always
//use the number defined in constant CRYPT_SALT_LENGTH
$trimmed_password_hash = substring($password_hash, CRYPT_SALT_LENGTH);
mysql_query("INSERT INTO `users` (username,p assword_hash) VALUES '$valid_username', '$trimmed_password_hash'");
...
$dbRes = mysql_query("SELECT password_hash FROM `users` WHERE username = '$user_input_username' LIMIT 1");
//re-apply salt to output of database and re-run algorithm testing for match
if (substring($salt, CRYPT_SALT_LENGTH) . mysql_result($dbRes, 0, 'password_hash') ) ===
crypt($user_input_username . $user_input_password, $salt) ) {
//... do stuff for validated user
}