- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 node.js 的应用程序中,我使用 crypto module用于对称加密/解密。
我正在使用 AES-256-CTR。我最初假设 crypto.createCipher将“只是工作”和“挥手”的细节。现在我正在阅读文档:
Note: createCipher derives keys with the OpenSSL function EVP_BytesToKey with the digest algorithm set to MD5, one iteration, and no salt. The lack of salt allows dictionary attacks as the same password always creates the same key. The low iteration count and non-cryptographically secure hash algorithm allow passwords to be tested very rapidly.
In line with OpenSSL's recommendation to use pbkdf2 instead of EVP_BytesToKey it is recommended you derive a key and iv yourself with crypto.pbkdf2 and to then use createCipheriv() to create the cipher stream.
好吧,我可以自己导出 IV 和 key 。
但是,我不确定,这样做的正确和推荐方法是什么 - 我是否应该使用不同的盐分别对两者进行 key 推导?我应该做一个 key 推导然后减半吗?对于这个特定的用例,我应该完全使用盐吗?我应该随机生成盐并将其与数据一起保存吗?
最佳答案
should I do key derivation separately for both, with different salts?
您当然可以这样做,但是具有大致相同安全性的更快的替代方法是使用如下内容:
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
Should I do one key derivation and then cut it in half?
请求比底层哈希函数提供更多的输出字节是有问题的。如果您想要一个 AES-256 key (256 位)和一个 64 到 128 位的随机数 (IV),那么您需要使用 SHA-384 (sha384) 或 SHA-512 (sha512) 作为基础 摘要
均由 node.js 提供。
Should I randomly generate the salt and save it with the data?
是的,您需要将盐与密文一起发送,以便接收方可以使用他们拥有的密码和盐来生成相同的 key +随机数。
也许您指的是随机数本身。这是第三种选择,您必须随机生成随机数并将其与随机(加密)盐和密文一起存储。
上述所有方法提供的安全性大致相同,但它们在密文中包含的内容和额外的计算时间方面有所不同。我建议使用最简单的方法,因为 ...
您还应该实现密文身份验证。如果您不这样做,那么您的系统可能容易受到填充 oracle 攻击。
您可以将第一个建议与附加 key 一起用于加密然后 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();
然后您还需要在密文中包含身份验证标签,并在解密之前检查它在接收方是否匹配。
您还可以使用 node.js 支持的 GCM 等身份验证模式。
关于node.js - crypto.pbkdf2 派生 IV 和 key 到 crypto.createCipheriv 的正确设置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963624/
题目地址:https://leetcode-cn.com/problems/course-schedule-iv/ 题目描述 你总共需要上 n 门课,课程编号依次为 0 到 n-1 。 有的课会
我即将使用以下脚本来加密和解密一些数据。我正在使用它,因为我当前的加密在我们的新服务器上不起作用。我们目前正在使用 mcrypt,所以我想更改为 openssl。 在我们的数据库中,我们使用 aes
有人可以告诉我为什么会收到此错误消息吗?显然这是我缺少的某种转换 预期 IV 长度为 16 但实际为 24 我用它来调用它 String encrypted = "E5ADDEB05D9D7B3925
这是我用来加密/解密数据的代码: // Set the method $method = 'AES-128-CBC'; // Set the encryption key $encryption_ke
1.题目 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
在 AES 中,我的理解是盐是使密码更安全的东西,它不会被添加到加密文本中。但是IV是用来加密第一个消息 block 的东西,将被添加到加密文本中。 我有什么问题吗? 最佳答案 AES 本身并不直接使
我需要编写一个简化的加密 API,它可以通过使用随机生成的 key 或密码派生的 key 轻松处理对称加密。 密码生成是使用 OpenSSL 库中的 PKCS5_PBKDF2_HMAC() 函数并使用
我正在 Java 中使用 AES/CTR/NoPadding 使用恒定 key 和随机 IV 来加密我的消息。 我计划将 IV 添加到密文前面,然后对其进行 Base64 编码。 现在有一个问题困扰着
如果在加密明文时使用随机IV,那么密文的接收者如何知道IV是什么以对其进行解密? 这是对上一个关于 IVs here. 的 stackoverflow 问题的回复的后续问题 The IV allows
我“到处”都找过了,但找不到。是否有示例说明如何使用 c++ Quantlib 来对具有合成行使价/到期日的期权价格进行插值? 例如,如果“今天”是 2017 年 2 月 6 日,我得到了 2017
当我尝试为 TripleDES 加密器创建 IV 初始化向量时出现以下错误。 请看代码示例: TripleDESCryptoServiceProvider tripDES = new TripleDE
我无法理解以下句子:“初始化向量 (IV) 中的数字全为零(不是 ASCII 字符‘0’)。 我的目标是使用 openssl enc 命令使用 aes-128-cbc 和 key K(比如 12345
我正在阅读有关如何对 key 加盐以确保加密安全的教程,但没能充分理解它。我对密码学了解不多,需要一些帮助。我正在使用 commoncrypto 来加密文件,并且已经完成,除了它不安全这一事实....
我正在尝试创建dBase文件,因为似乎我的Export vba代码中的.TransferDatabase()方法要求该文件存在(请继续获取“字段将不适合记录”。假设由于文件不存在)。 我在网上使用vb
是否建议我使用 initialization vector加密/解密我的数据?它会让事情变得更安全吗?这是需要根据具体情况进行评估的事情之一吗? 为了将其放入实际上下文中,Win32 加密函数 Cry
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我试图在加密后但写入之前将一个 16 字节安全生成的 IV 附加到每个文件上。这样我以后就可以通过从文件中拉出 IV 来解密它。这是我到目前为止的代码: public static void encr
了解 PKCS5_PBKDF2_HMAC()需要一个salt 并返回一个derivedKey 还有那个GCM::Encryption.SetKeyWithIV()需要 iv(以及 derivedKey
我是一名优秀的程序员,十分优秀!