java - 找不到任何支持 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 项目本身中也是如此)。
有人可以帮我吗?
解决方案
基本上,供应商"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 显式使用OAEPParameterSpec
and MGF1ParameterSpec
。不幸的是,Java 可能默认使用 SHA-1,并且始终使用相同的哈希函数是最兼容的选项。
推荐阅读
- python - 基于Python中的特定列合并行
- javascript - 如何从.net core 或 express 后端获取通知以响应 js 前端?
- firebase - 新:类型'_InternalLinkedHashMap
' 不是类型 'DocumentSnapshot' 的子类型 - c++ - 有没有办法将输入类型包装到 C++ 中的模板类?
- c++ - 替换二维数组中的字符
- python - Python - 如何正确地将条形图与线子图对齐?
- swiftui - 模型中 UserDefaults 的 SwiftUI 问题
- ios - RxSwift:将 RX 绑定添加到 UITextField 时出错:'Binder 类型的值
' 没有成员 '去抖动' - python - 如何将列表中的相同整数加在一起?
- javascript - JavaScript:元素定位