【发布时间】:2020-09-07 12:35:54
【问题描述】:
我想在 Android 中使用 AndroidKeyStore 计算 RSA 数字签名。我有两个解决方案,第一个是使用 java.security.Signature,第二个是使用 javax.crypto.Cipher。一开始,我尝试使用 Signature 对象并成功计算签名,但我遇到了问题。签名对象根据我的数据自己制作摘要,所以我的第一个问题是:
1-有没有办法通过禁用计算哈希来使用签名对象?
然后我通过下面的代码选择了第二种解决方案(使用 Cipher 对象):
// *** Creating Key
KeyPairGenerator spec = KeyPairGenerator.getInstance(
// *** Specified algorithm here
// *** Specified: Purpose of key here
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
spec.initialize(new KeyGenParameterSpec.Builder(
alias, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1) // RSA/ECB/PKCS1Padding
.setKeySize(2048)
// *** Replaced: setStartDate
.setKeyValidityStart(notBefore.getTime())
// *** Replaced: setEndDate
.setKeyValidityEnd(notAfter.getTime())
// *** Replaced: setSubject
.setCertificateSubject(new X500Principal("CN=test"))
// *** Replaced: setSerialNumber
.setCertificateSerialNumber(BigInteger.ONE)
.build());
KeyPair keyPair = spec.generateKeyPair();
并使用密钥:
Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidKeyStoreBCWorkaround");
inCipher.init(Cipher.ENCRYPT_MODE, privateKey);
但是在“inCipher.init”函数中我得到了这个错误:
java.security.InvalidKeyException: Keystore operation failed
caused by: android.security.KeyStoreException: Incompatible purpose`
我的第二个问题是:2- 有什么问题? (不得不说,我可以用公钥加密,但不能用私钥计算签名)
我用没有 androidKeyStore 的私钥加密了一条消息,我成功了。代码如下:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
PublicKey pub = kp.getPublic();
PrivateKey pvt = kp.getPrivate();
Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
inCipher.init(Cipher.ENCRYPT_MODE, pvt);
byte[] x = new byte[]{0x01, 0x01, 0x01, 0x01};
byte[] result = inCipher.doFinal(x, 0, x.length);
【问题讨论】:
-
通常签名是根据消息的哈希计算的。这是 99.99% 的用例所需要的。显然不支持称为“带有消息恢复的签名”的东西。这没关系,因为后一种技术只节省了少量的存储空间。如果您不使用 AndroidKeyStore,您的代码是否有效?
-
感谢您的回答。在我们的架构中,消息被散列,但由另一个实体。我们收到摘要消息并直接签名。我测试了一个没有 androidKeyStore 的示例代码,它签名成功。我编辑了我的问题并添加了示例代码。
标签: android cryptography android-keystore