使用OpenSSL和Android时的不同RSA签名
在看了这么多类似的问题之后,我还没有找到答案 我正在用这两种语言唱一份文件使用OpenSSL和Android时的不同RSA签名,android,security,openssl,digital-signature,sha256,Android,Security,Openssl,Digital Signature,Sha256,在看了这么多类似的问题之后,我还没有找到答案 我正在用这两种语言唱一份文件 openssl rsautl-sign…和openssl-dgst-sign… 这两个选项显然提供了不同的输出 我的问题是,当我在android应用程序上签名时,使用: public byte[] signData(byte[] data, PrivateKey privateKey) { Signature signature = null; try { signature = Sign
openssl rsautl-sign…
和openssl-dgst-sign…
这两个选项显然提供了不同的输出
我的问题是,当我在android应用程序上签名时,使用:
public byte[] signData(byte[] data, PrivateKey privateKey) {
Signature signature = null;
try {
signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
此函数返回完全不同的十六进制字符串。
android上的验证方法:
byte[] sigBytes = hexStringToByteArray(signature);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
Signature signCheck = Signature.getInstance("android ");
signCheck.initVerify(publicKey);
signCheck.update(data.getBytes("UTF-8"));
boolean isVerified = signCheck.verify(sigBytes);
仅验证android应用程序生成的十六进制字符串
使用openssl命令(已经尝试使用大多数可用参数),我似乎无法生成相同的十六进制字符串
仅供参考:我使用RSA和SHA256登录android和命令行
从android中,我得到以下十六进制字符串:《代码>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 54D8394050CEAC2EDD92021CDB34038699AAA49B1BFDF6823ADEFA185B036A6DF30955A152D51B64BCAF83AF79B6F7EEE783AC4217D6CE6604AF7E016C53B0D86E70AEDD4178AE039B12ED2731AD45321DEF9E394
从openssl(openssl dgst-sha256-binary-sign private.pem data.txt | hextump
),我得到:(代码>代码>代码>8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 C62221847D2893716A712292B701A5C65901D05635655D9D31253C1F53E7B1741A460A0F7DEDCEF4CA4039AA5385B49BE486A6380488FB5A0DEEF8BDD0F70874866EF6FC6BD71271F1AE30112F8BD0
请帮助,干杯。我有不同的输出签名字符串,带有命令“openssl pkeyutl-sign…”和java代码:
Signature sig = Signature.getInstance("SHA256withRSA");
更改此指纹后,我最终得到了相同的输出:
Signature sig = Signature.getInstance("NONEwithRSA");
签名可能重复,且签名大小不足以容纳RSA块大小,因此对其进行了填充。一些填充算法使用随机数据,因此不同的结果并不一定意味着有问题。如果不是相同的十六进制值,我如何在android端验证它?我尝试在数据两端签名“asdasd”,但仍然为相同的输入提供不同的字符串+