50

私は現在、パスワードのハッシュに次のものを使用しています。

var pass_shasum = crypto.createHash('sha256').update(req.body.password).digest('hex');

プロジェクトをより安全にするための改善策を提案していただけますか?

4

7 に答える 7

98

次のコードを使用して、パスワードをソルトおよびハッシュします。

var bcrypt = require('bcrypt');

exports.cryptPassword = function(password, callback) {
   bcrypt.genSalt(10, function(err, salt) {
    if (err) 
      return callback(err);

    bcrypt.hash(password, salt, function(err, hash) {
      return callback(err, hash);
    });
  });
};

exports.comparePassword = function(plainPass, hashword, callback) {
   bcrypt.compare(plainPass, hashword, function(err, isPasswordMatch) {   
       return err == null ?
           callback(null, isPasswordMatch) :
           callback(err);
   });
};
于 2012-12-24T00:35:26.797 に答える
7

bcryptは同期的に呼び出すこともできます。サンプルCoffeescript:

bcrypt = require('bcrypt')

encryptionUtil = 
    encryptPassword: (password, salt) ->
        salt ?= bcrypt.genSaltSync()
        encryptedPassword = bcrypt.hashSync(password, salt)
        {salt, encryptedPassword}

    comparePassword: (password, salt, encryptedPasswordToCompareTo) ->
        {encryptedPassword} = @encryptPassword(password, salt)
        encryptedPassword == encryptedPasswordToCompareTo

module.exports = encryptionUtil
于 2014-06-25T18:02:17.967 に答える
4

また、ノード用のbcrypt-nodejsモジュールがあります。https://github.com/shaneGirish/bcrypt-nodejs

以前、ここですでに説明したbcryptモジュールを使用しましたが、win7x64で問題が発生します。一方、bcrypt-nodejsはbcryptの純粋なJS実装であり、依存関係はまったくありません。

于 2014-12-03T01:07:20.537 に答える
3

typescriptでbcrypt

npm i bcrypt
npm i -D @types/bcrypt
 import * as bcrypt from 'bcrypt';

export const Encrypt = {

    cryptPassword: (password: string) =>
        bcrypt.genSalt(10)
        .then((salt => bcrypt.hash(password, salt)))
        .then(hash => hash),
    
        comparePassword: (password: string, hashPassword: string) =>
            bcrypt.compare(password, hashPassword)
            .then(resp => resp)
    
    }

例:暗号化

const myEncryptPassword = await Encrypt.cryptPassword(password);

例:比較

const myBoolean = await Encrypt.comparePassword(password, passwordHash);
于 2021-06-08T02:25:23.903 に答える
1

パスワードの暗号化にはbcrypt-jsパッケージを使用できます。

  1. npmibcryptjsをお試しください
  2. var bcrypt = require('bcryptjs')intop
  3. パスワードをハッシュするには:
bcrypt.genSalt(10, function(err, salt) {
    bcrypt.hash("B4c0/\/", salt, function(err, hash) {
        // Store hash in your password DB.
    });
});
  1. パスワードを確認するには、
// Load hash from your password DB.
bcrypt.compare("B4c0/\/", hash, function(err, res) {
    // res === true
});

bcryptjsの詳細については、https: //www.npmjs.com/package/bcryptjsにアクセスしてください。

于 2019-01-13T13:12:53.600 に答える
1

Bcryptを使用してみてください。ハッシュを使用してパスワードを保護します。

bcrypt.hash(req.body.password, salt, (err, encrypted) => {
    user.password = encrypted
    next()
})

ここで、saltは、ハッシュの強度を指定するコスト値です。ログイン中に、bcrypt.compareメソッドを使用してパスワードを比較します。

 bcrypt.compare(password, user.password, (err, same) => {
      if (same) {
           req.session.userId = user._id
           res.redirect('/bloglist')
      } else {
           res.end('pass wrong')
      }
 })

詳細については、次のブログを参照してください:https ://medium.com/@nitinmanocha16/bcrypt-and-nodejs-e00a0d1df91f

于 2019-07-18T07:57:09.670 に答える
0

Bcryptは悪い選択ではありませんが、いくつかの落とし穴があります:

  1. NULバイト単位で切り捨てられます。
  2. 72文字を超えると切り捨てられます。パスフレーズを使用している場合、これによりパスワードが予期せず弱くなる可能性があります。

2019年10月の時点で、Argon2idが最適な選択です。

Argon2idとのインターフェースの好ましい方法は、libsodium(多くの機能を提供する暗号化ライブラリ)を使用することです。選択できるバインディングはいくつかありますが、最も簡単なのはおそらくナトリウムプラスです。

const SodiumPlus = require('sodium-plus').SodiumPlus;
let sodium;
(async function(){
    if (!sodium) sodium = await SodiumPlus.auto(); // Autoload the backend

    let password = 'Your example password goes here. Provided by the user.';

    // Hashing...
    let hash = await sodium.crypto_pwhash_str(
        password,
        sodium.CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
        sodium.CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
    );
    // You can safely store {hash} in a database.

    // Checking that a stored hash is still up to snuff...
    let stale = await sodium.crypto_pwhash_str_needs_rehash(
        hash,
        sodium.CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
        sodium.CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
    );
    if (stale) {
        // Rehash password, update database
    }

    // Password verification
    let valid = await sodium.crypto_pwhash_str_verify(password, hash);
    if (valid) {
        // Proceed...
    }
})();

Githubのsodium-plusのドキュメントには、パスワードのハッシュと保存が含まれています。

于 2019-10-12T07:31:10.400 に答える