2011-08-05 11 views
69

node.jsとmongodbを使ってパスワードやその他の機密データを安全に保存する方法の例を探しています。Node.jsとMongoDBでパスワードを保存する

モンゴ文書のハッシュに沿って保存する固有の塩をすべて使いたいと思います。

認証のために、入力を暗号化して暗号化して、格納されたハッシュと一致させる必要がありますか?

このデータを復号化する必要がありますか?その場合、どうすればよいですか?

プライベートキー、またはソルト方法はサーバーに安全に保存されていますか?

AESとBlowfishがどちらも良い選択だと聞いたことがありますが、どうすればいいですか?

これをどのように設計するかの例は素晴らしいことでしょう。

ありがとうございました!

+0

可能重複http://stackoverflow.com/questions使用しています/ 615704 /優先するデータベース格納パスワードの方法) – Thilo

+0

https://github.com/bnoguchi/mongoose-auth/? – Alfred

答えて

35

使用この:https://github.com/ncb000gt/node.bcrypt.js/

bcryptのは、このユースケースに焦点を当て、わずか数のアルゴリズムの一つです。パスワードを解読することは決してできず、ユーザーが入力したクリアテキストのパスワードが保存された/暗号化されたハッシュと一致することを確認するだけです。

bcryptは、使用するのが非常に簡単です。私のMongoose Userスキーマ(CoffeeScript)の抜粋です。 bycryptはゆっくりと(意図的に)async関数を使用してください。

class User extends SharedUser 
    defaults: _.extend {domainId: null}, SharedUser::defaults 

    #Irrelevant bits trimmed... 

    password: (cleartext, confirm, callback) -> 
    errorInfo = new errors.InvalidData() 
    if cleartext != confirm 
     errorInfo.message = 'please type the same password twice' 
     errorInfo.errors.confirmPassword = 'must match the password' 
     return callback errorInfo 
    message = min4 cleartext 
    if message 
     errorInfo.message = message 
     errorInfo.errors.password = message 
     return callback errorInfo 
    self = this 
    bcrypt.gen_salt 10, (error, salt)-> 
     if error 
     errorInfo = new errors.InternalError error.message 
     return callback errorInfo 
     bcrypt.encrypt cleartext, salt, (error, hash)-> 
     if error 
      errorInfo = new errors.InternalError error.message 
      return callback errorInfo 
     self.attributes.bcryptedPassword = hash 
     return callback() 

    verifyPassword: (cleartext, callback) -> 
    bcrypt.compare cleartext, @attributes.bcryptedPassword, (error, result)-> 
     if error 
     return callback(new errors.InternalError(error.message)) 
     callback null, result 

はまた、 this article, which should convince you that bcrypt is a good choiceを読んで、あなたは "うまく、本当にeffed" なることを避けるために役立ちます。

+1

私は、記事が指摘しているように、それが遅いためbcryptを使用するロジックを購入するのは100%確信していません。 SHA-256のようなもっと標準的で広く使われているアルゴリズムを使用することはできず、システムに人為的な遅延を課すだけの理由はありません。サーバが実際に渡されたハッシュをチェックする前に、ちょうど4分の1​​秒待ってください。パスワードがy時間以内に間違ってx回取得された場合、ユーザのロックアウト(または特権の削減)プロトコルも課されます。それには一定の荷物が付属していますが、考慮するオプションです。 – d512

+18

あなたはポイントがありません。重要なのは、攻撃者があなたのデータベースのパスワードハッシュを盗み、bcryptが攻撃者のシステム上で実行するのが遅く、その作業要素がアルゴリズム自体に組み込まれているため、回避できないことです。 SHA-256プラス人工待ち時間はA)一般的な目的のハッシングアルゴリズムを使用しています。B)盗まれたパスワードハッシュのオフラインクラッキングから保護していません。 –

+0

はい、攻撃者が実際にすべてのパスワードハッシュのコピーを得ることができたシナリオでは、bcryptの下で攻撃者がクラッシュする時間が増えます。この記事では特にこのケースについては言及していませんが、おそらくそうすべきです。 – d512

関連する問題