Encryption AES使用固定IV密钥。与Diffie-Hellman密钥交换结合使用时

Encryption AES使用固定IV密钥。与Diffie-Hellman密钥交换结合使用时,encryption,cryptography,public-key-encryption,public-key,encryption-symmetric,Encryption,Cryptography,Public Key Encryption,Public Key,Encryption Symmetric,场景: 1) 多个客户端连接到WebAPI。 2) 客户端在初始握手时请求Diffie-Hellman交换密钥,然后仅当在20秒内发生这种情况时(共享密钥在服务器上20秒后过期),才将“共享密钥”重新用于下一次API调用 使用此“共享密钥”的推荐加密方法是什么? 这似乎是AES,但我有IV值的问题 IV是否可以是所有客户的固定值? IV是否可以仅在这些客户端调用块中公开? IV是否应该以某种方式与共享密钥相关 是否有更好或类似的加密机制只需要密钥(无IV,无需其他值)?对于CBC模式加密,IV应

场景:
1) 多个客户端连接到WebAPI。
2) 客户端在初始握手时请求Diffie-Hellman交换密钥,然后仅当在20秒内发生这种情况时(共享密钥在服务器上20秒后过期),才将“共享密钥”重新用于下一次API调用

使用此“共享密钥”的推荐加密方法是什么?
这似乎是AES,但我有IV值的问题

IV是否可以是所有客户的固定值?
IV是否可以仅在这些客户端调用块中公开? IV是否应该以某种方式与共享密钥相关


是否有更好或类似的加密机制只需要密钥(无IV,无需其他值)?

对于CBC模式加密,IV应该是随机的。在CBC模式下使用AES是可以的,您可以简单地将IV作为密文的前缀。当且仅当您从未使用密钥创建另一个密文时,才可以使用固定IV或零值IV。或者也可以使用CTR模式和nonce。nonce只能是唯一的,并且可以从其他数据派生

如果要创建传输协议,应始终添加完整性和身份验证。最简单的方法是在IV和密文上添加HMAC。最好使用不同的钥匙;您可以通过使用KDF从机密和一些区别数据创建两个密钥来实现这一点(这可以是一些简单的东西,比如安全散列)。在CBC模式下解密(或在流密码模式下使用明文)之前,必须检查身份验证标记

请注意,仅使用DH就容易受到中间人攻击。您必须验证DH公钥并添加某种身份验证


由于所有的陷阱(还有更多),人们通常会选择一些TLS密码套件来代替。

对于CBC模式加密,IV应该是随机的。在CBC模式下使用AES是可以的,您可以简单地将IV作为密文的前缀。当且仅当您从未使用密钥创建另一个密文时,才可以使用固定IV或零值IV。或者也可以使用CTR模式和nonce。nonce只能是唯一的,并且可以从其他数据派生

如果要创建传输协议,应始终添加完整性和身份验证。最简单的方法是在IV和密文上添加HMAC。最好使用不同的钥匙;您可以通过使用KDF从机密和一些区别数据创建两个密钥来实现这一点(这可以是一些简单的东西,比如安全散列)。在CBC模式下解密(或在流密码模式下使用明文)之前,必须检查身份验证标记

请注意,仅使用DH就容易受到中间人攻击。您必须验证DH公钥并添加某种身份验证


由于所有的陷阱(还有更多),人们通常会选择一些TLS密码套件来代替。

我同意owlstead的回答,但我会尝试做一个简单的回答:

  • 在Gcm或CBC模式下使用AES。CBC是最常见的。两者都需要静脉注射。不,没有更好的选择不使用静脉注射
  • IV无法修复。必须为每个新加密生成。建议使用加密安全的随机数生成器生成它
  • IV不是一个秘密值
正如猫头鹰所提到的,你需要比Diffie Hellman更多的东西来安全地完成这项工作,因为你正在以你描述的方式向中间人攻击敞开大门。此外,owl正确地指出了您应该处理的其他安全问题


一般来说,我们都同意最好的选择是坚持使用SSL/TLS。这件事很难做对。

我同意owlstead的回答,但我会尽量做一个简单的回答:

  • 在Gcm或CBC模式下使用AES。CBC是最常见的。两者都需要静脉注射。不,没有更好的选择不使用静脉注射
  • IV无法修复。必须为每个新加密生成。建议使用加密安全的随机数生成器生成它
  • IV不是一个秘密值
正如猫头鹰所提到的,你需要比Diffie Hellman更多的东西来安全地完成这项工作,因为你正在以你描述的方式向中间人攻击敞开大门。此外,owl正确地指出了您应该处理的其他安全问题


一般来说,我们都同意最好的选择是坚持使用SSL/TLS。这种东西很难正确使用。

每一次加密操作的IV都应该是不同的、随机的。它不必是秘密的。有什么理由不只是使用SSL吗?考虑到这已经是一个web API,添加它应该很简单,并且您或您的客户都需要最少的额外开发。它可能比您自己构建的任何机制都更安全。是的,API已经在SSL下运行了。这个额外的步骤是加密在不同客户端和服务器之间来回发送的许可信息…所以我认为这应该进一步加密,还是我错了?通过SSL保护的通道传输,您的通信已经可以防止窃听、中间人攻击和篡改,你想用额外的加密来缓解什么样的威胁?好吧,也许是错误的信息在我这边。我有SSL,但在来回发送注册和许可证信息时需要添加额外的加密。我们是说SSL就足够了,如果我用纯文本发送许可证信息…它仍然会保持超级安全?对于每个加密操作,IV应该是不同的和随机的。它不必是秘密的。有什么理由不只是使用SSL吗?考虑到这已经是一个web API,添加它应该很简单,并且您或您的clie需要最少的额外开发