Cipher.getInstance("AES")
Android的Lint抱怨上述代码如下:
如果不设置加密模式和填充,就不应该调用cipher.getinstance。
上面的代码可以很好地工作,正如如此的回答解释的那样。
有人能说明一下如何正确使用cipher.getinstance()吗?
发布于 2022-04-04 17:44:30
在实例化Cipher
实例时,应该始终显式地指定算法、模式和填充,例如:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
如果只指定了算法,则应用模式和填充的特定于提供程序的值,请参阅安卓或Java文档中的Java。这有许多容易出错的缺点,因此应严格避免:
Lint工具通过警告指出了这些问题,如果不设置加密模式和填充,就不应该调用Cipher.getInstance。顺便说一句,Lint报告还警告说,当欧洲央行使用AES/ECB/PKCS5Padding
指定时,欧洲央行将面临不安全的问题:不应使用欧洲央行加密模式。
相反,当用AES/CBC/PKCS5Padding
指定CBC时,不会在Lint中触发警告。
尽管CBC比欧洲央行更安全,但CBC只支持保密。因此,除了保密性外,提供真实性和完整性的认证加密应该是首选,例如GCM。由于GCM是基于CTR的,即流密码模式,所以不需要填充,而不像欧洲央行或CBC这样的分组密码模式(参见分组密码工作方式)。因此,GCM是用AES/GCM/NoPadding
指定的。
在这里,您可以找到一篇关于CBC和ECB:我应该使用欧洲央行或CBC加密模式作为我的分组密码吗?之间的区别的文章,以及关于CBC和GCM:CBC和GCM模式有什么区别?之间的差异的文章。
最后,关于PKCS#5填充的一点说明:由于历史原因,在Java世界中,称为PKCS#5填充的实际上是PKCS#7填充。在这里,您可以找到有关这个主题的更多细节:PKCS#5填充和PKCS#7填充有什么区别?。
https://stackoverflow.com/questions/71728508
复制相似问题