java - IOS 和 JAVA 中带有 RSA 的 SHA 提供 InvalidKeySpecification
问题描述
我正在按照以下 URL 在 IOS 设备中构造私钥和公钥,并且后端代码正在使用 java 进行验证。
RSA 在 iOS (Swift) 上签名并在 Java 中验证
让我分享一下Java的代码片段
public static void main(String[] args) {
String messageText = "Hello World!";
final byte[] signature = Base64.decodeBase64("");
final byte[] modulus = Base64.decodeBase64("") ;
final byte[] exponent = Base64.decodeBase64("");
try {
final Signature sig = Signature.getInstance("SHA512withRSA");
final KeyFactory keyMaker = KeyFactory.getInstance("RSA");
final RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus),
new BigInteger(exponent));
final RSAPublicKey pubKey = (RSAPublicKey)keyMaker.generatePublic( pubKeySpec );
sig.initVerify( pubKey );
sig.update( messageText.getBytes() );
final boolean result = sig.verify( signature );
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
我像IOS代码一样运行上面的代码并将输出作为输入传递给java方法并低于异常
{
exponent = {length = 4, bytes = 0x41514142};
modulus = {length = 172, bytes = 0x414d4d61 734a4c4d 30755658 38656e79 ... 5a357332 506a6e64 };
signature = {length = 128, bytes = 0x42b66ff0 e47aa4c3 f9b4ff38 664a4d87 ... 24cf05ac 4e8e0dc0 };
text = "Hello World!";
}
堆栈跟踪
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: RSA keys must be at least 512 bits long
at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:239)
at java.base/java.security.KeyFactory.generatePublic(KeyFactory.java:352)
at care.solve.node.SignatureValidationMain.main(SignatureValidationMain.java:53)
Caused by: java.security.InvalidKeyException: RSA keys must be at least 512 bits long
at java.base/sun.security.rsa.RSAKeyFactory.checkKeyLengths(RSAKeyFactory.java:167)
at java.base/sun.security.rsa.RSAKeyFactory.checkRSAProviderKeyLengths(RSAKeyFactory.java:145)
at java.base/sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:92)
at java.base/sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:340)
at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:235)
这是 IOS 代码片段,我们使用了这个 Heimdall 框架https://github.com/henrinormak/Heimdall
self.heimdall = Heimdall(tagPrefix: "com.hnormak.heimdall.example", keySize: 1024)
let text = "Hello World!"
let publicKey = heimdall!.publicKeyComponents()!
let modulus = publicKey.modulus.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0))
let exponent = publicKey.exponent.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0))
let signature = heimdall!.sign((text.data(using: String.Encoding.utf8)?.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0)))!)
let verSig = Data(base64Encoded: signature!, options: Data.Base64DecodingOptions(rawValue: 0))
let message: NSDictionary = ["text": text, "signature": signature, "modulus": modulus, "exponent": exponent ]
print(message)
解决方案
推荐阅读
- arrays - 这是什么类型的排序?
- python - 如何从新的 PySimpleGUI 错误弹出窗口中找到有问题的代码
- python - 向现有的 ods 表添加新的数据行
- python - 将两个绘图生成的表格彼此相邻放置
- c# - MVVM - 如何处理 ViewModel 中由模型组成的匿名类型
- sql-server - SQL Server 2008 R2:BCP 0 行已复制
- amazon-web-services - 不同的权限相同的 S3 存储桶,parquet 文件
- flutter - 在其他页面上使用 CustomListTile
- mule - 从 dwl 1.0 mule 3 中的有效负载中删除空值行
- list - 我是 Flutter 的新手,试图在 btn click 上添加一个单词(该单词来自文本字段)。然后我希望列表显示在页面上