找不到任何支持 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING 的提供商
Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
我在 javax crypto 中使用 RSA 加密时遇到了一个奇怪的问题。我使用 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
模式如下:
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");
它在我的 spring 引导项目中正常工作。但是当我在同一个项目中通过 main(String[] args)
调用同一个函数时,我遇到了问题
Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
。同样,如果我使用 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
,我会得到正确的输出(我不想使用 ECB,因为我知道它在 RSA 算法中没有用)。
此外,在我的另一个 spring 引导项目中,我遇到了上述相同的问题(这次不仅是 main(String[] args)
,而且 Spring 引导项目本身也是如此)。
有人可以帮我解决这个问题吗?
基本上,"SunJCE"
提供商提供的 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
中的 ECB 用词不当。它可能是从旧 Java 版本的块密码模式复制而来的。它不允许 允许对多个块进行加密,这正是您对 ECB 模式 的期望。换句话说,它与 "RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"
完全相同 - 但 Java SE 通常不提供该算法。
它在您的 Spring 引导项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或提供此算法的其他提供程序)。然而,这是一个 纯软件 提供商,存在侧信道保护问题。一般来说,您应该更喜欢 "SunJCE"
提供程序中的实现。
只使用 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
而不明确指定提供商是最好的方法。
[编辑] 我强烈建议使用 OAEPParameterSpec
和 MGF1ParameterSpec
明确设置用于标签和 MGF1 的 SHA-256 哈希。不幸的是,Java 可能默认为 SHA-1,并且在所有地方使用相同的散列函数是最兼容的选项。
当我遇到这个问题时,我可以通过像这样指定提供者来解决它
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
。所以看来我们需要使用重载的consutructor
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);
我在 javax crypto 中使用 RSA 加密时遇到了一个奇怪的问题。我使用 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
模式如下:
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");
它在我的 spring 引导项目中正常工作。但是当我在同一个项目中通过 main(String[] args)
调用同一个函数时,我遇到了问题
Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
。同样,如果我使用 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
,我会得到正确的输出(我不想使用 ECB,因为我知道它在 RSA 算法中没有用)。
此外,在我的另一个 spring 引导项目中,我遇到了上述相同的问题(这次不仅是 main(String[] args)
,而且 Spring 引导项目本身也是如此)。
有人可以帮我解决这个问题吗?
基本上,"SunJCE"
提供商提供的 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
中的 ECB 用词不当。它可能是从旧 Java 版本的块密码模式复制而来的。它不允许 允许对多个块进行加密,这正是您对 ECB 模式 的期望。换句话说,它与 "RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"
完全相同 - 但 Java SE 通常不提供该算法。
它在您的 Spring 引导项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或提供此算法的其他提供程序)。然而,这是一个 纯软件 提供商,存在侧信道保护问题。一般来说,您应该更喜欢 "SunJCE"
提供程序中的实现。
只使用 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
而不明确指定提供商是最好的方法。
[编辑] 我强烈建议使用 OAEPParameterSpec
和 MGF1ParameterSpec
明确设置用于标签和 MGF1 的 SHA-256 哈希。不幸的是,Java 可能默认为 SHA-1,并且在所有地方使用相同的散列函数是最兼容的选项。
当我遇到这个问题时,我可以通过像这样指定提供者来解决它
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
。所以看来我们需要使用重载的consutructor
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);