gpt4 book ai didi

cryptography - 初始化向量 - 最佳实践(对称加密)

转载 作者:行者123 更新时间:2023-12-04 01:47:58 26 4
gpt4 key购买 nike

我想询问有关使用初始化向量 (IV) 和对称密码算法 key 的最佳实践。

我想接受来自客户端的消息,加密它们并存储在后端。这将在一段时间内完成,稍后会有请求汇集消息并以可读的形式返回它们。

据我所知,在加密多个单独的消息期间, key 可以是相同的。 IV 应该随着每次新的加密而改变。然而,这会导致问题,因为每条消息都需要不同的 IV 以便稍后解密。

我想知道这是否是最好的方法。有没有办法避免在每条消息中存储 IV,这将简化加密/解密的整个过程?

最佳答案

IV 选择有点复杂,因为确切的要求取决于操作模式。但是,有一些通用规则:

  • 使用随机 IV 不会出错¹,除非在允许这样做的模式下使用较短的 IV。
  • 切勿使用相同的 key 使用相同的 IV。
  • 如果您只使用给定的 key 加密单个消息,则 IV 的选择无关紧要²。
  • 独立于要加密的数据选择 IV。
  • 永远不要使用欧洲央行。

  • 最常见的特定操作模式:
  • CBC 要求 IV 随机均匀生成。不要将计数器用作 CBC 的 IV。此外,如果您正在加密一些包含您从第三方收到的部分的数据,请在您完全收到数据之前不要透露 IV。
  • CTR 使用 IV 作为计数器的初始值,它为每个块递增,而不是为每个消息递增,并且每个块的计数器值都需要是唯一的。对于所有现代对称密码(包括 AES,无论 key 大小),一个块是 16 个字节。因此,对于 CTR,如果您使用 0 作为 IV 加密 3 块消息(33 到 48 字节),则下一条消息必须以 IV=3(或更大)开始,而不是 IV=1。
  • Chacha20、GCM、CCM、SIV 等现代模式使用随机数作为它们的 IV。当模式被描述为使用随机数而不是 IV 时,这意味着唯一的要求是 IV 永远不会与相同的 key 重用。它不必是随机的。

  • 在对数据库中的数据进行加密时,将行 ID(或其派生的值)用作 IV 通常是不安全的。仅当行从未更新或删除时使用行 ID 才是安全的,否则第二次使用相同的 ID 存储数据时,它会重复 IV。看到使用相同 key 和 IV 加密的两条不同消息的对手很可能能够解密这两条消息(详细信息取决于模式以及攻击者对消息内容的猜测程度;请注意,即使是弱猜测,例如“它是可打印的 UTF-8” 可能就足够了)。

    除非您有充分的理由不这样做(仅每行保存几个字节不算是一个很好的理由)并且密码学家已经审查了您存储和检索数据的具体方式:
  • 使用经过身份验证的加密模式,例如 GCM、CCM、SIV 或 Chacha20+Poly1305。
  • 如果您可以在某处存储一个计数器并确保只要您继续使用相同的加密 key 它就不会重置,那么每次加密消息时:
  • 增加计数器。
  • 使用计数器的新值作为经过验证的加密的随机数。

  • 先递增计数器的原因是,如果进程中断,会导致跳过计数器值,这不是问题。如果第 2 步在没有第 1 步的情况下完成,则会导致重复随机数,这是不好的。使用此方案,如果模式允许,您可以从 nonce 长度中减少几个字节,只要该长度足够大以容纳您将要加密的消息数量。
  • 如果您没有这样的计数器,则使用最大随机数长度并生成一个随机计数器。使用最大 nonce 长度的原因是由于 birthday paradox ,当消息数量接近 2n/2 时,随机 n 位 nonce 预计会重复。
  • 无论哪种情况,您都需要在行中存储随机数。

  • ¹ 假设一切都正确实现,例如随机值需要使用适合密码学的随机生成器生成。
    ² 只要不是以依赖于键的方式选择。

    关于cryptography - 初始化向量 - 最佳实践(对称加密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488243/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com