2016-12-13 6 views
1

ウェブアプリケーションでパスワードハッシュを扱うのは初めてのことです。 私はのサンプルをコピーして理論には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を格納するためにはどのデータ型が必要ですか?それとも、私は間違ったアプローチをしていますか?

+0

に与えられている、と述べました。出力はhttp://stackoverflow.com/questions/30687160 –

+0

に起因しています。私はあなたの最初の質問をよく理解していません。この塩は、新しいユーザーごとにランダムな塩として生成されます。それはかなりユニークです。あなたはまた、DBのユーザーのための 'ID'のように、塩として何かを使うこともできますが、これはまだ一意です。そして、それを 'hash'、' hashSize'などで 'parts'に連結します。なぜここでそれを取得する必要がありますか?後で特定のパスワードを認証したいときは、 'parts'の長さと順序をすべて知っているので、' parts'から 'salt'部分を取り出し、そのパスワードをハッシュしてその真偽を確認することができます。 – Aidin

+0

'あなたのデータベースでは 'varchar'や' char'といったテキストがあります。塩を分けて別々に保管しないでください。 – Aidin

答えて

0

私が正しく、あなたの質問を理解していれば:

を私の理解では、塩は、すべてのアカウントに対して一意でなければなりません。

byte[] salt = new byte[SALT_BYTE_SIZE]; 
random.nextBytes(salt); 

それはユニークなランダムな塩を生成します。 データベースからのユーザーにはIDを使用することもできますが、無作為に生成された塩もユニークです。新しいユーザーごとにランダムに新しい塩が生成されるためです。このsaltは、あなたのコード内でhashと一緒に連結され

hashSize、アルゴリズムとparts

// format: algorithm:iterations:hashSize:salt:hash 
String parts = "sha1:" + 
    PBKDF2_ITERATIONS + 
    ":" + hashSize + 
    ":" + 
    toBase64(salt) + 
    ":" + 
    toBase64(hash); 
return parts; 

iterationsの数は多くの場合、あなたは異なる部分の長さ(バイトサイズ)でを知っていますpartsとなり、必要な部分を抽出することができます。あなたのケースでは、興味のある部分を抽出することがさらに簡単になりますセパレータとして:をしても追加されている。

そして、どのようなデータタイプIは、MySQLデータベースに塩を格納する必要があるでしょうか?

あなたpartsを得た後、これを使用すると、テキスト(varcharまたはchar)としてデータベースに保存するものです。それを分離して別途に保管してください。salt。一緒にまとめてみてください。

ユーザーがログインしたい場合は、パスワードを入力します。今度はpartsをデータベースから取得し、saltiterationsなどの数値をpartsから抽出します。これは後でどのように連結されるかを正確に把握しているからです。次に、その情報を使用して、入力されたパスワードをユーザーから再度ハッシュします。今度は新しいハッシュを古いハッシュと比較します。それらが同じであれば、ユーザーは正しいパスワードを、そうでない場合は正しいパスワードを入力します。

常に[[email protected]をコンソールに書き込みます。 @JonSkeetとして

はあなたがSOには良いアイデアになることはありませんここで、複数の質問に、求めている答えはConverting String to Sha-256 Hash