找不到任何支持 RSA/None/OAEPWITHSHA-256ANDDMGF1PADDING 的提供商

问题描述 投票:0回答:2

我在

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 项目本身中也是如此)。

有人可以帮我吗?

java spring spring-boot cryptography sha
2个回答
12
投票

基本上,由

"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
提供商提供的
"SunJCE"
中的 ECB 是用词不当。它可能是从旧 Java 版本中的分组密码模式复制而来的。它允许加密多个块,这正是您对 ECB 模式所期望的。换句话说,它与
"RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"
完全相同 - 但 Java SE 通常不接受该算法名称。

它在 Spring Boot 项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或在其中注册带有

none
的算法名称的另一个提供程序)。然而,Bouncy Castle 是一家“纯软件”提供商,存在侧通道保护问题。一般来说,您应该更喜欢在"SunJCE"内实现。
仅使用 

"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"

而不明确指定提供者是最好的方法。


[编辑] 我强烈建议使用
OAEPParameterSpec

MGF1ParameterSpec
明确设置用于标签和 MGF1 的 SHA-256 哈希值。不幸的是,Java 可能默认使用 SHA-1,并为标签使用相同的哈希函数,并且 MGF1 是最兼容的选项。
    


0
投票
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())

。所以看来我们需要使用重载构造函数

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

    

© www.soinside.com 2019 - 2024. All rights reserved.