security - 使用 AES-256-CBC 与 block 加密的文件加密

标签 security encryption tcp aes cbc-mode

首先这是我在这里的第一个问题,我希望我能让你清楚地了解这个问题,也能帮助其他可能面临类似挑战的人!问题的标题也是我能得到的最短的 TL;DR :-)

因此,为了给您一些背景知识,我基本上是在设计一个协议(protocol),该协议(protocol)需要从服务器(在 Node.js 中实现)到设备的同步和有序文件传输,通过 <强>TCP。流式传输文件不是一种选择,因此每个文件 block 都封装在一条消息中,该消息具有其他非加密字段,这超出了这个问题的范围。

其中一个要求是文件内容不能以纯文本形式发送,因此必须选择一种加密方案,在这种情况下我选择了AES-256-CBC,假设为了这个问题的目的,算法不能改变。

由于设备限制(RAM ~10KB),需要将文件(<5 MB)拆分成 block ,然后根据上述协议(protocol)将其发送到设备,遵循发送/[ack|repeat] 方案。在接收时,设备能够将 block 存储在磁盘上。

所以我的主要问题是在后端我必须在以下两者之间做出选择:

  • 加密整个文件,然后将其拆分成 block

    -> 在接收设备上会将每个 block 附加到一个文件中,然后在接收到所有 block 时对其进行解密。

对比

  • 将文件分成 block ,然后对每个 block 进行加密。

    -> 需要发送用于每个 block 加密的初始化向量 (IV) 才能对其进行解密。

    -> 在 block 接收时,设备必须解密 block 或使用各自的 IV 存储每个 block ,然后在接收到最后一个 block 后解密它们。

此处的目标是了解每种方法会产生哪些安全问题,以及它们之间的开销比较。

PS:我也有一个完整性验证方案,但不在问题范围内。

最佳答案

为了回答您的问题,除了我在其他评论中提到的关键 AES 问题之外,我认为最好的方法是第二种解决方案。但在你的情况下,我会为每个 block 添加一个 HAMC。所以:

  • 将文件分成 block
  • 为每个 block 生成一个 IV
  • 使用相应的 IV 和 AES key 加密 block
  • 添加一个 HMAC(使用与加密不同的 AES key ,因此您需要 2 个 AES key )计算每个 block 的 IV+Cipher_text(使用加密 block 而不是明文 block 很重要)<
  • 发送你的 block
  • 在设备上接收您的 block 。
  • 检查每个 block 的 HMAC(这样它会确认 block 没有损坏并且经过良好验证)
  • 用第一个 key 和相应的 IV 解密 block
  • 添加所有 block 以获取原始文件。

第二个更安全,因为您可以在解密之前控制所有 block 。

我的意思是,如果你逐 block 加密并添加一个 HMAC,当你在你的设备上收到一个 block 时,首先你检查 HMAC,如果没问题,你可以解密该 block 。这样,如果有人在您的网络上并试图破坏 block 或任何其他内容,HMAC 可以验证加密 block 的来源和内容。

虽然这对于您的第一个选项是不可能的。如果有人试图在传输过程中破坏一个 block ,那么,最好的情况是你不能解密你的全局 block ,最坏的情况是它可能会向黑客提供一些关于加密系统的信息。它只是攻击者的一 block 拼图。这还不够,他需要更多的尝试才能解密一个 block ,但这是有风险的。

关于security - 使用 AES-256-CBC 与 block 加密的文件加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506178/

相关文章:

security - 是否应该始终依赖错误检测机制?

php - 安全地向 Flash 游戏的获胜者提供唯一的密码?

c++ - 如何在 Linux 中生成真随机数(不是伪随机数)

java - 这种 AES 加密是否足够安全?

linux - 如何找到使用 TCP 端口的进程?

c++ - 在 C# 中反序列化在 C++ 中序列化的字节数组

c - __func__ 标识符如何构成安全风险?

security - Docker容器通讯

encryption - 如何在 C# 3.0 中以简单的方式加密 cookie 内容?

c# - C 和 C# 实现之间的 AES/CBC 加密差异