我正在开发一个 Android 应用程序,我需要使用javaSignature
类进行数据认证。
在每台 Android 设备上,我都可以对数据进行签名并验证其签名。但是,给定要签名的明确数据块、明确的模数、明确的私有指数和明确的公共指数,我的签名输出是不同的,具体取决于设备。我确实尝试了一堆设备,我获得了 Android 3.2 和 3.2.1 的相同签名,但对于 Android 2.2.x 设备却不同。
我从之前KeyFactory
在 java 项目中使用 RSA 生成的常量字段计算这些签名。密钥大小为 2048 位。
这是我用来调用签名和验证的代码的引用。
public byte[] signData(byte[] data, PrivateKey privateKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
}
public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sigBytes);
}
如果我没记错的话,使用带有 RSA 的 SHA256 的签名是确定性的。那么我该如何解释这种行为呢?另一个有趣的问题,我怎样才能让它跨设备工作,即签名是一样的,不管我使用哪个设备?
提前谢谢你,弗兰克!