首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Cipher.getInstance("AES")的正确方法是什么?

使用Cipher.getInstance("AES")的正确方法是什么?
EN

Stack Overflow用户
提问于 2022-04-03 17:50:49
回答 1查看 474关注 0票数 1
代码语言:javascript
运行
复制
Cipher.getInstance("AES")

Android的Lint抱怨上述代码如下:

如果不设置加密模式和填充,就不应该调用cipher.getinstance。

上面的代码可以很好地工作,正如如此的回答解释的那样。

有人能说明一下如何正确使用cipher.getinstance()吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 17:44:30

在实例化Cipher实例时,应该始终显式地指定算法、模式和填充,例如:

代码语言:javascript
运行
复制
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

如果只指定了算法,则应用模式和填充的特定于提供程序的值,请参阅安卓Java文档中的Java。这有许多容易出错的缺点,因此应严格避免:

  • 许多提供商使用欧洲央行模式和PKCS#5填充作为默认值,例如BouncyCastle提供者在Android上(测试的API级别为28和29)。然而,欧洲央行模式是不安全的,因此不应该应用,参见为什么我不应该使用欧洲央行的加密?。为了防止使用欧洲央行模式,需要显式地指定该模式。
  • 如果涉及到具有不同默认值的模式和填充的不同提供者,则可能会出现跨平台问题。
  • 模式和填充的明确说明提高了可读性。

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填充有什么区别?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71728508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档