2

我目前的项目是我在 Node.js 中的第一个项目(如果重要的话,也使用 MongoDB、Mongoose 和 Express),并且很容易分心,我在决定如何处理用户身份验证时掉进了加密的兔子洞。(此项目不需要其他加密)。

遵循此页面上的模式(模式,而不是代码 - 我在安装 node.bcrypt 时遇到问题,但在安装 node-sodium 时遇到问题)以及此页面上我的流程是

  1. 新用户通过 https 提交密码

  2. 模式生成盐

  3. 架构散列密码和盐的串联

  4. 架构存储盐和密码以及用户信息

现在我不知道这是否是我个人的缺陷,但我在遵循libsodium 文档时遇到了麻烦。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);

所以问题是两个部分。这是一个好的过程,代码是否合适?

4

3 回答 3

4

scrypt-for-humans正是出于这个原因,我过去曾使用过该软件包。

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

Scrypt 是一个非常安全的散列库,这个更高级别的包装器让你很难搞砸任何事情。它还专门为安全地散列密码而设计,所以这也是一个积极的方面:)

于 2017-02-09T20:25:16.787 回答
1

目前最好的密码散列算法是Argon 2Emil Bay编写了一个名为secure-password的模块。他在此播客上详细讨论了加密安全密码散列和最佳实践。这是他所说的关于Argon 2的片段。

通常,当您布置威胁模型时,从数学角度来看完美的安全性几乎是不切实际的。(在密码学中,可以称为完全保密,这意味着,即使你有一个宇宙大小的巨大计算机,不管它有多大,你都不能破坏安全性,但这在现实世界。)取而代之的是,您选择了一种称为计算保密的东西。这意味着你可以打破这个,但它会花费你太多的钱和太多的时间。

这些散列函数的目标是使暴力破解这些算法变得如此昂贵,以至于尝试毫无意义。在威胁模型中,您知道您不会获得完美的安全性,但您能否让对手攻击您变得如此昂贵。

Argon 2有两个参数可以使其免受大规模 GPU 攻击。您可以控制允许该函数使用多少内存,并且可以控制生成哈希所需的计算时间。CPU 通常有很多内存但只有几个内核。GPU 的内存很少,但有数千个内核。Argon 2会占用大量内存,而您只能在单个 GPU 上同时执行大约 4 或 8 个Argon 2哈希,这使得尝试破解的成本太高。在安全密码中,我采用了制造钠的弗兰克丹尼斯提出的价值观。它在像网站这样的交互式服务的范围内,可以在不减慢速度的情况下创建合理的安全性。要散列密码,您需要大约 16 或 32 Mb 的内存,这些参数可以在Argon 2中控制。

于 2018-02-01T23:36:17.077 回答
-3

就我个人而言,我使用了加密,并且我执行了与您现在正在执行的完全相同的 4 个步骤(在检查了几个条件之后 7 个字符通过、一个符号、一个数字......)。我将使用加密共享代码。

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");

编辑警告这不是一种完全安全的方法,因为它可能会变得可预测。请参阅下面的评论,其中解释了为什么它不是一个好方法。

于 2017-02-09T22:59:16.640 回答