当前位置: 首页 > 知识库问答 >
问题:

节点中密码存储的加密最佳实践

通骁
2023-03-14

我正在寻找一个简单、安全的解决方案,使用Node存储用户密码。我是一个密码学新手,但是一直在试图通过网上搜索拼凑出一个解决方案。我正在寻找一种验证,即我所提出的是一个具有基本(而不是银行、医院等)安全需求的web应用程序的可靠解决方案。这是:

var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;

function createHashedPassword(plainTextPassword, cb) {
    crypto.randomBytes(SALT_LENGTH, function (err, salt) {
        console.time('password-hash');
        crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
            console.timeEnd('password-hash');
            return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
        });
    });
};

…以下是我做出的选择让我走到了这一步:

使用什么哈希算法?

根据这篇被广泛引用的文章,看起来领先的竞争者是PBKDF2、bCrypt和scrypt。我选择PBKDF2是因为它在Node中内置了支持。

使用什么盐大小?

这个堆栈溢出的答案似乎是我能找到的最直接的答案。尽管如此,我仍然不太清楚为什么64字节是正确的salt大小。当我谷歌一下,我得到了其他类似这样的堆栈交换答案,但我不确定它是否适用于节点算法?这里完全混乱,一个针对使用这个节点函数的新手的解释会很棒。

使用什么密钥长度?

再一次,我的选择很大程度上是基于和上面相同的答案,但是我对“为什么”这个基本问题也是一头雾水。答案是‘生成比你的输入更小的键是一种浪费,所以至少要用64字节’。啊?再一次,一个实际的解释将是有益的。

要使用多少迭代?

对于这个问题,我的选择基于这个堆栈交换答案。我不是很明白,但是我知道这个算法大概需要8ms。因此,正如你所看到的,我在函数上设置了计时器,并调整了我的迭代,使它在我的机器上保持在那个范围内。

谢谢!

共有2个答案

濮阳耀
2023-03-14

我强烈建议使用BCrypt。该算法有很多优点,大多数实现都能为您处理所有这些问题。

如本回答所述:

对于密码算法来说,BCrypt拥有最好的声誉:它已经存在了相当长的一段时间,使用相当广泛,“引起了注意”,但迄今为止仍未被打破。

我已经写了一篇关于如何在节点/快递以及其他框架中实现BCrypt的详细文章:http://davismj.me/blog/bcrypt

柯骏
2023-03-14

NPM 包凭据处理所有这些

你可以在《Javascript应用程序编程》一书中看到作者对此的论述

 类似资料:
  • 我已经使用Spring框架大约4年了,现在使用Spring Boot已经有几个月了。我的Spring MVC应用程序通常部署在Java EE容器上,如JBoss/WildFly或WebLogic。这样做允许我将JNDI用于数据源或任何其他涉及机密/密码的敏感数据。这使得我的应用程序基于其名称“消费”JNDI资源。 现在有了Spring Boot,尤其是对于自包含的微服务(嵌入式tomcat),这些

  • 问题内容: 在Java桌面应用程序中存储密码的推荐方式是什么? 我希望用户只能输入一次凭证,而不会再次提示。 在个人项目中,我一直在使用Preferences API,但我假设这与以纯文本格式存储(安全方面)没有什么不同。 非常感谢 编辑: 非常感谢您的建议。毫无疑问,这似乎有些混乱,因为我可能还没有把问题弄清楚。 我将给出一个假设的情况: 假设我正在为远程数据库创建一个简单的前端,该前端使用用户

  • 注意:为了讨论的目的,假设应用程序和数据库存储在单独的机器上,不共享密码等。因此数据库服务器的破坏并不自动意味着应用程序服务器的破坏。

  • 问题内容: 我正在使用Redis来存储一些信息并检测该信息随时间的变化(例如,考虑用户和位置)。使用更长或更短的键名的值是什么?使用更长的键会更清楚,但是使用更长的键名是否会在内存或性能上付出很多成本? 以下是示例: 要么 问题答案: 这完全取决于您将如何使用它。如果每个字节都很重要,例如,当您必须为传输到云服务的每个kB支付费用时,您可以计算成本。数学很简单;一个字节是“在线”上的一个字节。在r

  • 问题内容: 我计划在我的网站上为我的用户存储外国帐户信息,也称为RapidShare用户名和密码等。我想确保信息的安全,但是我知道,如果我对他们的信息进行哈希处理,我将无法将其检索以备后用。 Base64可以解密,因此毫无意义地使用它。我的想法是对用户进行加扰,即使在解密之后,也要以这种方式传递base64前后,如果尝试解密,则会得到一些看上去很有趣的文本。是否有一个php函数接受可以对字符串进行

  • 存储密码 用户名和密码组合必须存储在某处。以下列表提到了一些受欢迎的地方: 文字:你现在应该熟悉这种方法。 SQL数据库:FreeRADIUS包含与SQL数据库交互的模块。 MySQL非常受欢迎,并且广泛用于FreeRADIUS。 目录:Microsof的Actve目录或Novell的电子目录是典型的企业级目录。OpenLDAP是一种流行的开源替代方案。 FreeRADIUS可以使用的用户文件和S