NodeJS:bcrypt vs native crypto

fan*_*ncy 53 cryptography bcrypt node.js

有人可以指出两者之间的差异以及使用每种情况的示例情况吗?

bcrypt看起来很棒.

Mik*_*ott 69

使用bcrypt你想要进行缓慢且计算成本高昂的散列 - 这通常适用于你真的不希望攻击者能够反转散列的哈希,例如用户密码.使用本机加密来完成其他任务.

  • 您是否愿意详细说明为什么bcrypt更好/更强?我假设它使用更强/更长的哈希?它使用不同的算法吗?如果给出两个类似的密码,一个用本机加密进行哈希处理,另一个用bcrypt进行哈希反转的估计成本是多少呢? (6认同)
  • Bcrypt使用Blowfish算法,该算法具有计算上昂贵的密钥设置阶段.然后它修改它以允许密钥设置迭代可配置的次数 - 目前通常类似于4,096,但随着硬件变得更强大,它可以增加.因此,bcrypt和常规哈希之间的反向散列难度的差异取决于bcrypt配置. (5认同)
  • @kd12345 您无法使用 bcrypt 保护存储的信息 - 它是密码散列算法,而不是加密算法。 (2认同)
  • @kd12345 如今,您也可以使用加密作为密码。它同时实现了 PKDF2 和 scrypt——scrypt 似乎更好,但我不像十年前那么了解最新情况。 (2认同)
  • @kd12345 区别在于,获得您的数据库和加密密钥的攻击者无法恢复密码。 (2认同)

Igo*_*rra 19

与@ mike-scott的答案一致,你应该更喜欢bcrypt与密码相关的东西,但你仍然可以crypto用于各种任务,如创建随机令牌或HMAC校验和或SHA1/MD5哈希:

var crypto = require('crypto'); 

// random tokens
var buf = crypto.randomBytes(16).toString('hex');
console.log('Random token of %d bytes in hexadecimal: %s', buf.length, buf);
var buf = crypto.randomBytes(16).toString('base64');
console.log('Random token of %d bytes in base 64: %s', buf.length, buf);

// a hashed message authentication checksum (HMAC) using a shared secret key
var string = 'My coffee please';
var key = 'Right away sir';

var encrypted = crypto.createHmac('sha1', key).update(string).digest('hex');
console.log('Encrypting "%s" using passphrase "%s": %s', string, key, encrypted);

// a MD5 hash
var hashmd5 = crypto.createHash('md5').update(string).digest('hex');
console.log('The MD5 hash of "%s" is %s', string, hashmd5); 

// a SHA1 hash
var hashsha1 = crypto.createHash('sha1').update(string).digest('hex');
console.log('The SHA1 hash of "%s" is %s', string, hashsha1); 
Run Code Online (Sandbox Code Playgroud)


Bas*_*sav 17

我会使用 nodejs 的原生加密库

我认为决定不应该仅仅基于谁做得更好,它远不止于此

您应该知道为什么 node.js 包含一个用于加密的内置模块,而它最初不是 node.js 的一部分,并且许多库在 npm 存储库中很受欢迎,包括 bcrypt

原因是,密码学是一个重要的安全方面,使用来自 npm 的外部模块有可能注入恶意代码,这违背了最初的安全目标

因此需要一个受信任的库来实现这种加密功能,这也是 nodejs 提供这样一个库的动机

如果您认为加密方法不强,最好在 nodejs 上提出相同的问题,而不是盲目信任外部库

还是不相信我?阅读这篇文章https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5

  • 也许当其他答案和评论发布时,加密货币并没有得到这一点,但是(至少截至 2020 年)现在我同意 Basav 的观点。Node 的 crypto 具有密码导出函数,例如 scrypt,因此我认为使用内置解决方案更安全。 (7认同)
  • 您应该更喜欢 bcrypt,因为它的设计速度很慢。当有人暴力破解您的网站或窃取您的数据库时,您会希望处理每个密码的计算成本很高。在任何机器上都需要相同的时间,从而节省 GPU 功率 (5认同)
  • @Basav,所以如果我正在开发银行应用程序,我应该使用加密来加密我存储在数据库中的所有内容吗? (2认同)

Ehs*_*ari 8

在新的 Nodejs 版本中, crypto 模块中的scrypt函数可用于散列密码。

这是来自 Nodejs 文档:Scrypt 是一种基于密码的密钥派生函数,其设计成本很高,并且在内存方面成本很高,以便使暴力攻击变得无益。