ウェブアプリケーションでパスワードハッシュを扱うのは初めてのことです。 私はのサンプルをコピーして理論にはhttps://www.codeproject.com/articles/704865/salted-password-hashing-doing-it-rightを使用しました。 私の理解では、塩はすべてのアカウントで一意でなければなりません。だから私の質問は次のようになります。塩を使ったパスワードハッシュ処理の問題
なぜこの方法で生成された塩である:
public static String createHash(char[] password)
throws CannotPerformOperationException
{
// Generate a random salt
SecureRandom random = new SecureRandom();
byte[] salt = new byte[SALT_BYTE_SIZE];
random.nextBytes(salt);
// Hash the password
byte[] hash = pbkdf2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
int hashSize = hash.length;
// format: algorithm:iterations:hashSize:salt:hash
String parts = "sha1:" +
PBKDF2_ITERATIONS +
":" + hashSize +
":" +
toBase64(salt) +
":" +
toBase64(hash);
return parts;
}
私は必要があるだろう、何がハッシュ化されたパスワードと、データベースから使用される塩を保存する機能です。私はここから使用済みの塩をどのように取り出すことができますか?
System.out.println(salt);
は常にコンソールで
[[email protected]
を書き込みます。これはなぜですか?また、mysqlデータベースにsaltを格納するためにはどのデータ型が必要ですか?それとも、私は間違ったアプローチをしていますか?
に与えられている、と述べました。出力はhttp://stackoverflow.com/questions/30687160 –
に起因しています。私はあなたの最初の質問をよく理解していません。この塩は、新しいユーザーごとにランダムな塩として生成されます。それはかなりユニークです。あなたはまた、DBのユーザーのための 'ID'のように、塩として何かを使うこともできますが、これはまだ一意です。そして、それを 'hash'、' hashSize'などで 'parts'に連結します。なぜここでそれを取得する必要がありますか?後で特定のパスワードを認証したいときは、 'parts'の長さと順序をすべて知っているので、' parts'から 'salt'部分を取り出し、そのパスワードをハッシュしてその真偽を確認することができます。 – Aidin
'あなたのデータベースでは 'varchar'や' char'といったテキストがあります。塩を分けて別々に保管しないでください。 – Aidin