首页 > 解决方案 > 如何使用“AndroidKeyStore”提供程序生成唯一的 rsa 密钥对(2048)?

问题描述

我的 Android 应用程序中有此代码用于生成 RSA 密钥对。此代码在某些设备上的 Android 8 上生成相同的密钥对。设备包括联想 K8、诺基亚 3。

只有在这些设备上,生成的密钥对在相同型号中是相同的。如果我不使用 AndroidKeyStore Provider 而是使用 BouncyCastle,则密钥是唯一的。但我想使用 android 提供程序并且仍然生成唯一的密钥。

KeyPairGenerator keyPairGenerator = null;
try {

    keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");

    KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder("somealias", KeyProperties.PURPOSE_SIGN)
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setKeySize(2048)
        .build();
    keyPairGenerator.initialize(spec);

} catch(Exception e) {
    throw new KeyStoreException(e);
}

KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();

byte[] encodedP = publicKey.getEncoded();

每次都需要在所有设备上获取唯一的密钥。

使用这行代码连续两次运行 encodeP 的 Base64 编码值:
String basePub = Base64.getEncoder().encodeToString(encodedP);

运行#1

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9RmCTb9FJG8rS9ldKiLQsQ7wNtKMvr8aLB+5V7VlNxKkL14ZE+gBMbsHg0QNEL7SL+UiorDeHT5gMg1pHQrq/dJY8WehjXmOsjol8DZaX0qsOLKAqCP0mYK90OjbyZOoGNs7qq7crtSv+oF8aDFzUcTbx/SghEQM9ZjGXSgckpPUsMX3zzf3cZvwZPbTG6y9qAR43nlEAIRaeAPtz8hh/FunW5UeXajsHpyoD9im4HRgm3OzoZYdHXd6kSy1eCmqNJ4DzVmq9EVpX5YTBb3RqeADk7pVGck+eJK4d91Vk5cdsykX6ITCfQwFi1duywHkAZjIG6lXxsTW1HoC96qIfwIDAQAB

运行#2

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9RmCTb9FJG8rS9ldKiLQsQ7wNtKMvr8aLB+5V7VlNxKkL14ZE+gBMbsHg0QNEL7SL+UiorDeHT5gMg1pHQrq/dJY8WehjXmOsjol8DZaX0qsOLKAqCP0mYK90OjbyZOoGNs7qq7crtSv+oF8aDFzUcTbx/SghEQM9ZjGXSgckpPUsMX3zzf3cZvwZPbTG6y9qAR43nlEAIRaeAPtz8hh/FunW5UeXajsHpyoD9im4HRgm3OzoZYdHXd6kSy1eCmqNJ4DzVmq9EVpX5YTBb3RqeADk7pVGck+eJK4d91Vk5cdsykX6ITCfQwFi1duywHkAZjIG6lXxsTW1HoC96qIfwIDAQAB

标签: androidrsa

解决方案


推荐阅读