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

问题描述 投票:2回答:1

我想问一下关于一个初始化向量(IV)和对称密码算法密钥的使用的最佳做法。

我想从一个客户端接收消息,对其进行加密,并在后端存储。这将在一定时间来完成,并且会有在以后的时间来进行汇集了消息,并以可读的形式回报他们的请求。

据我所知道的,关键可以是多个独立的消息进行加密时相同。该IV应与每一个新的加密改变。然而,这会引起问题,因为每封邮件都需要进行去cryption不同的IV在以后的时间。

我想知道这是做的最好的方式。是否有任何方式,以避免存储IV与每一个消息,这将简化用的加密/解密的工作的整个过程?

cryptography aes encryption-symmetric
1个回答
1
投票

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

  • 你不能去wrong¹与随机IV,在模式,让这个使用更短的IV时除外。
  • 千万不要使用相同的密钥使用相同的IV。
  • 如果你永远只能加密与给定值的单个消息,IV的选择并不matter²。
  • 独立于数据的选择的IV进行加密。
  • 切勿使用ECB。

操作中最常见的具体模式:

  • CBC需要将随机均匀地产生的IV。不要使用计数器作为IV用于CBC。此外,如果你加密包含你从第三方获得的部分的一些数据,不露IV,直到你完全接收到的数据。
  • CTR使用IV作为递增每个块,而不是为每一个消息的计数器的初始值,并且计数器的值必须为每一个块是唯一的。块是用于所有现代对称密码16个字节(包括AES,无论密钥大小的)。因此,对于CTR,如果加密与0 3块消息(33至48字节)作为IV,下一消息必须以IV = 3(或更大),而不是IV = 1开始。
  • 现代模式,如Chacha20,GCM,CCM,SIV,等使用随机数作为其IV。当模式被描述为使用一个随机数而不是IV,这意味着,唯一的要求是,IV是永远不会使用相同的密钥重复使用。它不必是随机的。

当在数据库中的数据进行加密,所以通常不使用安全行ID(或从它衍生的值)为四。使用行ID是安全的只有该行从未更新或删除,否则第二次数据使用相同ID存储,它会重复IV。谁看到使用相同的密钥和IV加密的两个不同的消息很可能是能够解密两个消息(细节取决于模式和攻击者就可以多少猜测的消息内容的一个对手;注意,即使微弱的猜测,例如“它的打印UTF-8” 就足够了)。

除非你有一个很好的理由不这样做(只保存每行的几个字节不能算作一个很好的理由)和密码破译审查要在其中存储和检索数据的具体方式:

  • 使用验证的加密模式,例如GCM,CCM,SIV或Chacha20 + Poly1305。
  • 如果你能在一些地方保存一个计数器,并确保它从来没有,只要你继续使用相同的加密密钥重置,然后每次加密的消息: 增加计数器。 使用计数器的随机数的认证加密的新价值。 计数器递增,其原因首先是,如果过程被中断,这将导致跳过计数器的值,这是没有问题的。如果步骤2中没有步骤1中完成的,这会导致重复的随机数,这是不好的。有了这个计划,你可以刮胡子了几个字节断现时长度如果模式允许的话,只要长度为你永远加密邮件的数量足够大。
  • 如果你没有这样的计数器,然后用最大现时长和随机生成一个计数器。使用的最大随机数长度的原因是,由于birthday paradox,随机的n比特随机数,预计当消息的数量接近2π/ 2重复。
  • 在这两种情况下,你需要将现时存放一行。

¹假设一切都正确执行,例如随机值需要与随机发生器适合于密码术来产生。 ²只要它不依赖于键的方式选择。

© www.soinside.com 2019 - 2024. All rights reserved.