AES 加密有效负载作为签名
AES Encrypted payload as a signature
我有三条消息:
- 用户名
- IV,16字节
- 128 位 AES 加密负载
用户可以从同一网络上的多个 processes/devices 运行,并通过消息总线交换消息。每个用户都有一个预共享密钥(他们通过 SSL 调用中央服务器获得),该密钥每 X 小时更新一次并存储在内存中。
如果我使用预共享密钥(例如使用 try..catch(CryptoException)...
)成功解密消息的第三部分,我是否可以安全地假设它来自消息的第 1 部分?
如果网络是开放的(没有加密的 WiFi),是否存在暴露用户名元数据(这没问题)以外的数据的风险?
这一定是微不足道的,我现在假设它会起作用,但假设是所有错误之母,尤其是在加密领域...
此外(主要是出于好奇),如果多个用户在同一个进程中并且流氓用户 A 知道应用程序的源代码(从 dll 反映的 C#)并且可以嗅探机器上的所有流量,还有什么额外的步骤 我需要保护同一进程中其他用户的共享密钥免受用户 A 的侵害? (C# 中的应用程序,恶意用户可以运行除应用程序之外的任何东西,例如汇编程序)。我应该打扰吗,或者如果流氓用户有这样的访问权,游戏就结束了?
更新:
这门精彩课程的第 4 周是此类问题的必备课程:https://class.coursera.org/crypto-010/lecture/preview
我直觉上期望的是合成 IV https://www.rfc-editor.org/rfc/rfc5297,在链接课程的其中一个讲座中有很好的描述
不,攻击者对数据的任何更改都可能导致此类异常。基本上大多数密码操作模式都能够解密任何密文;密文和明文之间存在1:1关系。取消填充可能会失败。此外,消息(部分)有可能出现乱码,无一例外。出于这个原因,您应该使用经过身份验证的加密(正如 CodesInChaos 已经提到的那样)。
乱码填充会使您面临填充 oracle 攻击,无论使用何种块密码,这需要每个字节尝试 128 次才能完全破坏 CBC 模式的机密性 (!)。
如果您使用类似 GCM 的模式(如果可用),则 IV 已经受到经过身份验证的密码的保护。但是,用户名不是,因此您应该将其包含在 AEAD 密码的 AAD 部分中。如果您使用 HMAC,那么一定要在密文中包含完整的消息。如果你使用 MAC 然后也使用一个单独的密钥(这对于 HMAC 也是可取的,但是对于例如 AES-CMAC 这是一个更强的要求)。
如果用户可以完全控制您的机器,那么是的,游戏就结束了。如果他们也可以直接访问数据,那么他们是否可以获得保护数据的密钥并不重要。
我有三条消息:
- 用户名
- IV,16字节
- 128 位 AES 加密负载
用户可以从同一网络上的多个 processes/devices 运行,并通过消息总线交换消息。每个用户都有一个预共享密钥(他们通过 SSL 调用中央服务器获得),该密钥每 X 小时更新一次并存储在内存中。
如果我使用预共享密钥(例如使用 try..catch(CryptoException)...
)成功解密消息的第三部分,我是否可以安全地假设它来自消息的第 1 部分?
如果网络是开放的(没有加密的 WiFi),是否存在暴露用户名元数据(这没问题)以外的数据的风险?
这一定是微不足道的,我现在假设它会起作用,但假设是所有错误之母,尤其是在加密领域...
此外(主要是出于好奇),如果多个用户在同一个进程中并且流氓用户 A 知道应用程序的源代码(从 dll 反映的 C#)并且可以嗅探机器上的所有流量,还有什么额外的步骤 我需要保护同一进程中其他用户的共享密钥免受用户 A 的侵害? (C# 中的应用程序,恶意用户可以运行除应用程序之外的任何东西,例如汇编程序)。我应该打扰吗,或者如果流氓用户有这样的访问权,游戏就结束了?
更新: 这门精彩课程的第 4 周是此类问题的必备课程:https://class.coursera.org/crypto-010/lecture/preview
我直觉上期望的是合成 IV https://www.rfc-editor.org/rfc/rfc5297,在链接课程的其中一个讲座中有很好的描述
不,攻击者对数据的任何更改都可能导致此类异常。基本上大多数密码操作模式都能够解密任何密文;密文和明文之间存在1:1关系。取消填充可能会失败。此外,消息(部分)有可能出现乱码,无一例外。出于这个原因,您应该使用经过身份验证的加密(正如 CodesInChaos 已经提到的那样)。
乱码填充会使您面临填充 oracle 攻击,无论使用何种块密码,这需要每个字节尝试 128 次才能完全破坏 CBC 模式的机密性 (!)。
如果您使用类似 GCM 的模式(如果可用),则 IV 已经受到经过身份验证的密码的保护。但是,用户名不是,因此您应该将其包含在 AEAD 密码的 AAD 部分中。如果您使用 HMAC,那么一定要在密文中包含完整的消息。如果你使用 MAC 然后也使用一个单独的密钥(这对于 HMAC 也是可取的,但是对于例如 AES-CMAC 这是一个更强的要求)。
如果用户可以完全控制您的机器,那么是的,游戏就结束了。如果他们也可以直接访问数据,那么他们是否可以获得保护数据的密钥并不重要。