私は現在、パスワードのハッシュに次のものを使用しています。
var pass_shasum = crypto.createHash('sha256').update(req.body.password).digest('hex');
プロジェクトをより安全にするための改善策を提案していただけますか?
私は現在、パスワードのハッシュに次のものを使用しています。
var pass_shasum = crypto.createHash('sha256').update(req.body.password).digest('hex');
プロジェクトをより安全にするための改善策を提案していただけますか?
次のコードを使用して、パスワードをソルトおよびハッシュします。
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);
});
};
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
また、ノード用のbcrypt-nodejsモジュールがあります。https://github.com/shaneGirish/bcrypt-nodejs。
以前、ここですでに説明したbcryptモジュールを使用しましたが、win7x64で問題が発生します。一方、bcrypt-nodejsはbcryptの純粋なJS実装であり、依存関係はまったくありません。
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);
パスワードの暗号化にはbcrypt-jsパッケージを使用できます。
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash("B4c0/\/", salt, function(err, hash) {
// Store hash in your password DB.
});
});
// Load hash from your password DB.
bcrypt.compare("B4c0/\/", hash, function(err, res) {
// res === true
});
bcryptjsの詳細については、https: //www.npmjs.com/package/bcryptjsにアクセスしてください。
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
Bcryptは悪い選択ではありませんが、いくつかの落とし穴があります:
NUL
バイト単位で切り捨てられます。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のドキュメントには、パスワードのハッシュと保存が含まれています。