2017-02-09 1 views
2

私の現在のプロジェクトはNode.jsで初めてです(MongoDB、Mongoose、Expressも重要です)。気を散らすと、私はユーザー認証を扱う方法を決めながら、暗号のウサギの穴を塞いでしまいました。 (このプロジェクトでは他の暗号化は必要ありません)。 this page(パターンではなく、コード - 私はノード-ナトリウムでnode.bcryptをインストールしなくて問題を抱えています)上のパターンに続きパスワードを正しくハッシュしていますか?

also this page私のプロセスは

  1. 新しいユーザーがhttps

    上でパスワードを送信で
  2. スキーマ塩

  3. スキーマは

  4. パスワードと塩の連結をハッシュ生成
  5. スキーマは今、この私の個人的な不足ならば、私は知りませんが、私はthe libsodium documentation以下の問題を抱えていたユーザ情報

と塩とパスワードを保存します。 node-sodiumは、ハッシングの追加情報を提供していません(ただし、暗号化の例があります)。

これは、私はハッシュを生成するために使用するコードです:

let buf = new Buffer(sodium.crypto_pwhash_STRBYTES); 
sodium.randombytes_buf(buf, sodium.crypto_pwhash_STRBYTES); 
let salt = buf.toString(); 
let preBuffer = "somePass" + salt; 
let passwordBuf = Buffer.from(preBuffer); 
let hash = sodium.crypto_pwhash_str(passwordBuf, sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE, sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE); 

そこで問題は二つの部分です。これは良いプロセスですか、適切なコードですか?

答えて

-2

個人的に私はcryptoを使用しました。私はまさにあなたが今行っているのと同じ4つのステップを行っています。記号、1つの数字...)。私は暗号を使ってコードを共有します。

var salt =rand(160, 36);  
var salted_pass = salt + password; 
var token = crypto.randomBytes(64).toString('hex'); // I even generate a token for my users 
var hashed_password = crypto.createHash('sha512').update(salted_pass).digest("hex"); 

EDIT:それはpredictiblyなるかもしれないとして警告これは、それを行うためのcompletly安全な方法ではありません。それが良い方法ではない理由を説明する下記のコメントを参照してください。

+1

このコードはセキュリティ上の観点から__完全に__です。 SHA512の一回のパスは、パスワードのハッシュに十分ですが、実際のパスワードハッシュを使用することと全く同じです。あなたの 'rand'関数がどこから来ているのかわからなくても、私はそれが暗号的に安全なランダム値を提供していないと考えているので、安全でもありません。こちらもご覧ください:https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016 –

+0

@Alan [推奨読書](http://www.cryptofails.com/post/75204435608)/write-crypto-code-dont-publish-it)を実行します。 –

+0

@ScottArciszewski記事のためにありがとう – Alan

3

これまで正確にscrypt-for-humansパッケージを使用しました。

https://github.com/joepie91/scrypt-for-humans

Scryptは非常に安全なハッシュライブラリーであり、これより高いレベルのラッパーは、それは難しいあなたが混乱何かを最大になります。

0

最高のパスワードハッシュアルゴリズムはArgon 2です。 Emil Bayで書かれたsecure-passwordというモジュールがあります。彼は、暗号で安全なパスワードハッシュとベストプラクティスon this podcastについて詳しく述べています。彼が言ったことのスニペットはArgon 2です。

通常、脅威モデルをレイアウトするとき、数学的な観点からは完全なセキュリティはほとんど実用的ではありません。(暗号では、完全な秘密と呼ばれることがあります。つまり、巨大なコンピュータが巨大なコンピュータであっても、その大きさに関係なく、決してセキュリティを破ることはできませんが、それは実際には実用的ではありません実際の世界)。代わりに、計算機の秘密というものを探してください。これはあなたがこれを壊すことができることを意味しますが、それはあなたにあまりにも多くのお金を要し、余りにも多くの時間を要するでしょう

これらのハッシュ関数の目的は、これらのアルゴリズムを無理や​​りにするのは非常に高価にして、試行することに意味がないことです。脅威モデルでは、あなたは完全なセキュリティを得るつもりはないが、敵があなたを攻撃するためには非常に高価なものにすることができます。

Argon 2には、大規模なGPU攻撃から免除される2つのパラメータがあります。関数が使用できるメモリの量を制御することができ、ハッシュを作成するのに必要な計算時間を制御することができます。 CPUには通常、多くのメモリがありますが、いくつかのコアがあります。 GPUにはほとんどメモリがありませんが、数千のコアがあります。 Argon 2は、多くのメモリをダイヤルします。これは、1つのGPUで約4または8の同時のArgon 2ハッシュしか実行できないため、試してみると高価になります。 secure-passwordでは、私はFrank Deniseが作り出したナトリウムを作ったという価値を覚えました。ウェブサイトのようなインタラクティブサービスの範囲内であれば、速度を落とさずに合理的なセキュリティを構築する余裕があります。パスワードをハッシュするには、約16または32Mbのメモリが必要で、これらのパラメータはArgon 2で制御できます。

関連する問題