首页 > 解决方案 > 找不到任何支持 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING 的提供程序

问题描述

在 javax crypto 中使用 RSA 加密时遇到了一个奇怪的问题。我使用RSA/None/OAEPWITHSHA-256ANDMGF1PADDING的模式如下:

 Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");

它在我的 Spring Boot 项目中正常工作。但是当我在同一个项目中调用同一个函数时main(String[] args),我遇到了问题 Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING。同样,如果我使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING我会得到正确的输出(我不想使用 ECB,因为我知道它在 RSA 算法中没有用)。

此外,在我的另一个 Spring Boot 项目中,我遇到了同样的上述问题(这一次不仅main(String[] args)在 Spring Boot 项目本身中也是如此)。

有人可以帮我吗?

标签: javaspringspring-bootcryptographysha

解决方案


基本上,供应商"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"提供的欧洲央行"SunJCE"是用词不当。它可能是从旧 Java 版本中的分组密码模式复制而来的。它不允许加密多个块,这是您对 ECB模式的期望。换句话说,它与"RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"- 但该算法通常不随 Java SE 提供。

它在您的 Spring Boot 项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或提供此算法的另一个提供程序)。然而,这是一个纯软件提供商,存在侧信道保护问题。通常,您应该更喜欢"SunJCE"提供程序中的实现。

仅使用"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"而不明确指定提供者是最好的方法。


[编辑] 我强烈建议将 SHA-256 哈希设置为用于标签和 MGF1 显式使用OAEPParameterSpecand MGF1ParameterSpec。不幸的是,Java 可能默认使用 SHA-1,并且始终使用相同的哈希函数是最兼容的选项。


推荐阅读