encryption - AES-128-cbc的IV在加解密时是否需要随机?
问题描述
我正在使用节点和加密模块来加密和解密一个大的二进制文件。我使用 crypto.createCipheriv 加密文件并使用crypto.createDecipheriv解密它。
对于加密,我使用如下随机 IV:
const iv = crypto.randomBytes(16);
const encrypt = crypto.createCipheriv('aes-128-cbc', key, iv)
我不明白的是,我还需要通过随机 IVcreateDecipheriv
吗?这里的 SO说:
IV 需要相同才能进行加密和解密。
IV可以是静态的吗?如果它不能,它是否被认为是一个秘密?我将IV存储在哪里?在有效载荷中?
如果我使用不同的随机 IV 进行加密和解密,我的有效负载会被解密,但前 16 个字节已损坏。这意味着,看起来 IV 需要相同,但从安全角度来看,除了 16 个字节之外,有效负载被解密也没有太大价值。
谁能详细说明首选方法是什么?谢谢你的帮助!
解决方案
Key+IV 对绝不能在使用 CBC 的两次加密上重复。这样做会泄漏有关第一个块的信息(在所有情况下),并且会创建重复的密文(如果您曾经两次加密相同的消息前缀,这将是一个问题)。
因此,如果您的密钥在每次加密时都发生了变化,那么您的 IV 可能是静态的。但没有人这样做。他们有一个可以重复使用的密钥。所以IV必须改变。
不要求它是随机的。它只是不应该重复并且它不能是可预测的(在攻击者可以控制消息的情况下)。随机是最简单的方法。随机以外的任何东西都需要大量的专业知识才能正确,所以使用随机。
在 CBC 中重用 Key+IV 对会削弱密码的安全性,但不会像在 CTR 中那样破坏它。与 CTR 一起重用的 IV 可能会导致微不足道的解密。在 CBC 中,它通常只是泄漏信息。这是一个严重的问题,但不是灾难性的。(并非所有不安全的配置都是一样的。)
IV不是秘密。每个人都可以知道。所以它通常被添加到密文中。
推荐阅读
- node.js - 我可以从获取请求中绘制 D3 图吗?
- javascript - 如何突出显示字符串中每个句子的第一个单词?
- c# - 为什么 TryPopRange 可能会出现异常?并发栈
- javascript - Socket.io:事件侦听器中的 Socket.emit 工作非常奇怪
- powershell - 对组中不包括 OU 的用户运行 AD 搜索
- sql-server - 如何在 SSIS 中创建一个任务,用户可以在每次运行包时更改变量的值?
- azure - OCR Google 无法在 Azure 上运行
- java - 如果我在不同的网络/域中,是否可以使用计算机名称而不是 IP?
- python - Tensorflow Reshape 因 TypeError 失败:不允许使用 `tf.Tensor` 作为 Python `bool`
- c# - C#如何制作字典
>?