2016-06-17 9 views
1

ショートバージョン:ハッシュ値をJavaScriptライブラリnode-password-hashと比較するには?

私は今だ1は私のデータベースに既に存在だものに「等しい」であればどのように私は確認することができ、同じ値をランダム塩でハッシュ化されたかどうかを知りたいと思い、ユーザのパスワードとして保存されます。また、ここで同等の意味は何ですか?

ロングバージョン:

私はパスワードをハッシュ化する必要がある場合、ハッシュ関数は次のように動作することを考えて今まで:

  • のは、それがそのアルゴリズムSHA1
  • 使用だとしましょう、アルゴリズムを選択します。あなたが入力されたか、どのようにそれが
  • のように見えなかったユーザーでデータベースにハッシュ値を入れて、ログインが使用されたときに必要なものを推測することができないので、多くの入力を変更するには入力に再びハッシュ関数とユーザーと一緒に、ログインフェーズの間にそれらを格納、ランダムな塩を使用することが提案されているデータベース
  • ですでにだ1でそれを一致させるには、指定されたパスワードをハッシュし、それに合わせて、その塩を取りますすでにデータベースにハッシュされた値。だから、

、私はpasswordHash.generate()がランダム塩を使用していることを知っているのNode.js

var passwordHash = require('password-hash'); 

var foo = passwordHash.generate('password123'); 
var bar = passwordHash.generate('password123'); 

console.log(foo); //sha1$d1d19f32$1$d5cb099afdd9bb130c969e0394c9bf5e57d6a2aa 
console.log(bar); //sha1$df372235$1$99dfd5485e8a223e21738621bf4a7cdfca949721 


console.log(passwordHash.verify('password123', foo)); //true 
console.log(passwordHash.verify('password123', bar)); //true 

に次のコードを持って、それが$...$間の部分です。ドキュメンテーションでは、塩がどこかに保存されていることがわかりません。そうであれば、2つのハッシュ値が同じではないのはなぜですか?

私はpasswordHash.verify()ハッシュ"password123"と考えて、それがfoo、あるいはbarと同じであるかどうかを確認します。しかし、私は常にtrueを得るため、これが起こることはできませんが、foobarは異なっています。

それでは、どのようpasswordHash.verify()に動作しますか?

+0

は 'SHA1の$'とそれの後の最初の '$'との間の部分です。 (例: "d1d19f32")passwordHashはこれまで使用されていたのと同じ塩を使用してパスワードを再ハッシュし、同じハッシュを取得することを確認できます。 –

+0

ああああ。あなたは天才です。ありがとう、それは何も複雑ではなかった – sundri23

+0

@ user2882590あなたは別のライブラリを使用することをお勧めします。使用しているライブラリのREADMEには非推奨となっており、代わりにbcryptまたはscryptを使用する必要があります。https://github.com/davidwood/node-password-hash/blob/master/README.md – bhspencer

答えて

0

塩は$文字で区切ら生成によって返された文字列に含まれます。

SHA1の$ d1d19f32 $ 1 $ d5cb099afdd9bb130c969e0394c9bf5e57d6a2aa

ALG $塩$ハッシュ

パスワードのソースを見てみますハッシュは、$と塩を含む結果の文字列に対してverifyメソッドを呼び出すだけです。

これは彼らの検証機能です:あなたはそれが$上の入力文字列を分割した後、塩でハッシュを生成し、パスワードを比較し見ることができるように

module.exports.verify = function(password, hashedPassword) { 
    if (!password || !hashedPassword) return false; 
    hashedPassword = makeBackwardCompatible(hashedPassword); 
    var parts = hashedPassword.split('$'); 
    if (parts.length != 4) return false; 
    try { 
    return generateHash(parts[0], parts[1], password, parts[2]) == hashedPassword; 
    } catch (e) {} 
    return false; 
}; 

。これは、あなたがあなたの質問でやっているときと同じように、origional generateメソッドが返す文字列全体を使ってverifyメソッドを呼び出す必要があることを意味します。私は塩を推測している

+0

2分で自分自身、これはおそらくタイミング攻撃の対象です。がんばろう! –

+0

@self私は自分自身を圧延していない。私は単純にnode-password-hashというJS libに関するhttps://github.com/davidwood/node-password-hashに関するOPの質問に答えるだけです – bhspencer

関連する問題