crypto.pbkdf2 导出 IV 和密钥到 crypto.createCipheriv 的正确设置是什么?

2023-12-24

在 Node.js 的应用程序中,我使用加密模块 https://nodejs.org/api/crypto.html用于对称加密/解密。

我正在使用 AES-256-CTR。我最初假设加密.createCipher https://nodejs.org/api/crypto.html#crypto_crypto_createcipher_algorithm_password将是“只是工作”和“挥手”细节。现在我正在阅读文档:

注意:createCipher 使用 OpenSSL 函数 EVP_BytesToKey 派生密钥,摘要算法设置为 MD5,一次迭代,无盐。缺少盐允许字典攻击,因为相同的密码总是创建相同的密钥。低迭代次数和非加密安全散列算法允许非常快速地测试密码。

根据 OpenSSL 使用 pbkdf2 而不是 EVP_BytesToKey 的建议,建议您使用 crypto.pbkdf2 自行派生密钥和 iv,然后使用 createCipheriv() 创建密码流。

好吧,我可以自己导出 IV 和密钥。

但是,我不确定正确和推荐的做法是什么 - 我应该使用不同的盐分别为两者进行密钥推导吗?我应该进行一次密钥推导然后将其减半吗?对于这个特定的用例,我应该使用盐吗?我应该随机生成盐并将其与数据一起保存吗?


我应该使用不同的盐分别对两者进行密钥推导吗?

您当然可以这样做,但是具有大致相同安全性的更快替代方案是使用如下内容:

var master = crypto.pbkdf2Sync(password, randomSalt, 60000, 256, 'sha256');
var hmac = crypto.createHmac('sha256', master);
hmac.update("key");
var key = hmac.digest();

hmac = crypto.createHmac('sha256', master);
hmac.update("nonce");
var nonce = hmac.digest().slice(0,12); // 96 bit for CTR nonce

我应该进行一次密钥推导然后将其减半吗?

请求比底层哈希函数提供的输出字节更多的输出字节是有问题的。如果您想要 AES-256 密钥(256 位)和 64 至 128 位的随机数 (IV),那么您需要使用 SHA-384 (sha384) 或 SHA-512 (sha512) 作为底层digest它们都是由node.js 提供的。

我应该随机生成盐并将其与数据一起保存吗?

是的,您需要将盐与密文一起发送,以便接收者可以使用他们拥有的密码和盐来生成相同的密钥+随机数。

也许你指的是随机数本身。这是第三个选项,您必须随机生成随机数并将其与随机(加密)盐和密文一起存储。

结论

所有上述方法都提供大致相同的安全性,但它们在密文中包含的内容和额外的计算时间方面有所不同。我建议使用最简单的方式,因为......

您还应该实施密文身份验证。如果您不这样做,那么您的系统可能容易受到 padding oracle 攻击。

您可以将第一个建议与附加密钥一起用于加密然后 MAC 解决方案,如下所示:

hmac = crypto.createHmac('sha256', master);
hmac.update("hmac");
var hmacKey = hmac.digest();

// TODO encrypt

hmac = crypto.createHmac('sha256', hmacKey);
hmac.update(ciphertext);
var authenticationTag = hmac.digest();

那么您还需要在密文中包含身份验证标签,并检查它在接收方是否匹配before解密。

您还可以使用 Node.js 支持的身份验证模式,例如 GCM。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

crypto.pbkdf2 导出 IV 和密钥到 crypto.createCipheriv 的正确设置是什么? 的相关文章

随机推荐

  • 在lstm语言模型中使用预训练的word2vec?

    我用tensorflow来训练LSTM语言模型 代码来自here https github com tensorflow models blob master tutorials rnn ptb ptb word lm py 根据文章her
  • 将多个 json 数据添加到 panda 数据帧

    我正在使用 api 获取 3 个 json 数据 我想将这些数据添加到 1 个 panda 数据帧 这是我的代码 我传入的书籍中包含书籍 id 作为 x 这 3 个 id 返回了 3 个不同的 json 对象 其中包含所有书籍信息 for
  • WPF DataGrid CanUserAddRows = True

    我似乎在向 a 添加行时遇到问题DataGrid通过界面本身 这是用户界面的屏幕截图 正如您所看到的 在数据 库中找到了 0 行 因此没有任何内容显示在数据库中DataGrid在右侧 但我喜欢那里有一个空行 用于手动添加行 这DataGri
  • 获取 iOS Swift 中的顶级 ViewController

    我想实现一个单独的 ErrorHandler 类 它显示某些事件的错误消息 此类的行为应该从不同的其他类中调用 当发生错误时 会有一个UIAlertView作为输出 此 AlertView 的显示应始终位于顶部 因此 无论错误从哪里抛出 最
  • 如何将 RPC 与 Volttron 结合使用

    我想在我的 volttron 应用程序中使用 RPC 调用 但我无法让任何调用正常工作 所有调用都会失败 并出现 没有到主机的路由 错误
  • 为什么 Django 开发服务器会挂在这个管理工具 JS 文件上?

    使用 Django 管理工具时 它会定期挂起并停止响应请求 直到重新启动为止 每当它挂起时 日志中的最后一行是 获取 admin jsi18n HTTP 1 1 200 2158 挂起似乎发生在 POST 之后 例如查看添加对象的结果时 据
  • flowtype如何用可选字段注释联合

    如何在流程中实现以下目标 export type Response err string data Array data Array 我想表达一种类型 它返回错误和可选数据 或者不返回错误字段 如果没有 但是 我用它作为 return er
  • “npx tsc --version”报告虚拟机内不同的 TypeScript 版本

    我希望能够跑步npx tsc在我的主机 来宾操作系统上的项目中 但客人正在使用不同的 旧的 版本tsc 我不确定它是从哪里来的 我的设置 主机操作系统 Windows 10 来宾操作系统 Debian 9 我正在使用 VirtualBox
  • 使用 IDisposable 取消订阅事件

    我有一个处理来自 WinForms 控件的事件的类 根据用户正在执行的操作 我引用该类的一个实例并创建一个新实例来处理同一事件 我需要首先从事件中取消订阅旧实例 很简单 如果可能的话 我想以非专有的方式执行此操作 这似乎是 IDisposa
  • JQuery 自动完成:如何强制从列表中选择(键盘)

    我正在使用 JQuery UI 自动完成 一切都按预期进行 但是当我使用键盘上的向上 向下键循环时 我注意到文本框按预期填充了列表中的项目 但是当我到达列表末尾并再次按下向下箭头时这时 我输入的原始术语就会出现 这基本上允许用户提交该条目
  • git p4克隆/同步:如何添加新的P4路径

    我创建了一个 P4 客户端视图规范 并用它制作了一个 git p4 克隆 并定期同步 P4 的更改 效果非常好 有一天 我想向我克隆的 Git 存储库添加另一个 P4 路径 但它卡住了 即使我添加了 git p4 克隆使用的客户端视图规范的
  • mysql 自动终止查询

    mysql 是否有可能自动终止耗时超过 20 秒的查询 我猜您正在寻找名为 mk kill 的 maatkit 实用程序 它将杀死符合某些条件的查询
  • Tf.Print() 不打印张量的形状?

    我使用 Tensorflow 编写了一个简单的分类程序并获取输出 但我尝试打印模型参数 特征和偏差的张量形状 函数定义 import tensorflow as tf numpy as np from tensorflow examples
  • 我的解决方案中有两个 Web 项目,要部署哪一个

    我有一个像这样结构的解决方案 Proj Soln Proj Api csproj Proj Web csproj 我已使用 bitbucket org 配置了 microsoft azure 当我通过 git 提交到 bitbucket 时
  • Linux Mint 19.2 上的 Docker 安装不起作用 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 刚刚安装了一个新的 Linux mint 19 2 我需要 docker 所以我去了 docker 文档并遵循了该过程 https doc
  • 将值传递给捆绑的 React JS 文件?

    我想知道是否可以将参数传递给反应入口点 我的入口点如下所示 module exports entry js components Application js output path dist filename bundle js 我的应用
  • 如何在turbo c++ 16位编译器中创建项目

    我想创建一个项目文件 Turbo C 并链接该项目中的文件 虽然我已经尝试过 但我发现只有一个选项可以打开项目 没有选项可以创建新项目 那么如何做到这一点 基本上 你想做的是 开放项目 在那里 您输入项目名称 它必须以 PRJ 当你open
  • Angular2 中的事件委托

    我正在 ng2 中开发一个应用程序 但我正在努力解决一些问题 我正在构建一个日历 您可以在其中选择日期范围 我需要对此做出反应click mouseenter mouseleave日细胞上的事件 所以我有一个像这样的代码 简化的 日历 组件
  • 如何更改 SonataAdmin 中的“奏鸣曲项目”链接?

    我的 SonataAdminBundle 有问题 我找不到如何更改左侧板上的 奏鸣曲项目 链接 我有 我的标题 一张图片 下面有 奏鸣曲项目 我怎样才能改变这个 In order to customize the content of th
  • crypto.pbkdf2 导出 IV 和密钥到 crypto.createCipheriv 的正确设置是什么?

    在 Node js 的应用程序中 我使用加密模块 https nodejs org api crypto html用于对称加密 解密 我正在使用 AES 256 CTR 我最初假设加密 createCipher https nodejs o