我使用AES加密和CRC来检查数据完整性,我的印象是在我的情况下CRC校验是多余的。我正在做以下事情:
加密:
解密:
我想在单元测试中引发CRC校验失败但是当我操作有效负载数据时,解密总是抛出BadPaddingException。
我的问题是:如果解密总是在数据被破坏或被操纵时抛出此异常(是吗?)CRC校验不是我使用它的方式多余吗?
答案 0 :(得分:2)
假设错误解密的数据是均匀分布的,那么对于每255个不正确的密码,它看起来是正确的PKCS5 / PKCS7填充大约1次。这意味着仍有1/255的可能性会发生正确的更改,并且该项目将解密为垃圾。因此,您的支票不是浪费。
如果您确实需要预期的行为,可以使用“AES / CTR / NoPadding”,它不需要精确的块大小,并且无论密钥是否匹配,都将始终返回解密的byte []。
但是,如果攻击者可以反复更改密文并让您对其进行解密(例如,可能是存储在cookie中的加密数据),并且如果他们可以在解密数据引发错误填充的异常时区分您的行为,当它只是垃圾时,他们可以通过“填充oracle攻击”确定明文。
您可能还想考虑一个比CRC更强大的指纹是否合适,如SHA-256,以确保消息的完整性。
重复了很多这样的事情