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