android - 登录 java 时如何修复或避免“检测到 RSA 引擎错误解密/签名”错误
问题描述
我正在尝试在 Android 上使用 SpongyCastle 的基本 RSA 代码对字符串进行签名:
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
...
Signature sign = Signature.getInstance("SHA256withRSA");
RSAPrivateKey privateKey = parsePrivateKey( pk_pem_string );
sign.initSign(privateKey, new SecureRandom());
sign.update(content.getBytes("UTF-8"));
byte[] signature = sign.sign();
但它失败并出现此错误:
E/AndroidRuntime( 3392): Caused by: java.security.SignatureException: java.lang.IllegalStateException: RSA engine faulty decryption/signing detected
E/AndroidRuntime( 3392): at org.spongycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineSign(DigestSignatureSpi.java:142)
E/AndroidRuntime( 3392): at java.security.Signature$Delegate.engineSign(Signature.java:1418)
E/AndroidRuntime( 3392): at java.security.Signature.sign(Signature.java:739)
我发现生成此错误是为了防止 RSA-CRT 攻击,但没有关于如何修复或防止该问题的更多信息。我需要使用 SHA256withRSA 进行签名,因为我需要与期望使用该算法签名的内容的外部 API 进行交互。
如果我使用默认的 Android 安全提供程序,则登录失败并显示:
Caused by: java.lang.RuntimeException: error:04000044:RSA routines:OPENSSL_internal:internal error
解决方案
推荐阅读
- vimeo-api - Vimeo Player.js cuepoints Uncaught TypeError: Time must be a number:
- javascript - 为什么以及何时异步代码是非阻塞的?
- json - ReactJS 从自定义 API 获取数据并渲染数据
- node.js - 带有 Passport JWT 的 Apollo 服务器
- javascript - 如何使用 tensorflowjs_converter 转换 TensorFlow 图 .pb 文件?
- laravel - laravel中html形式的更新方法
- kubernetes - Traefik 中的多个路径指向 Kubernetes 后端的相同路径
- android - Webview 没有在棉花糖设备下面显示一些像数学符号这样的文本
- c++11 - 将指针内容复制到堆栈变量
- android - 如何将数据从活动传递到类