在硬件支持的Android密钥库中创建Keypair



我正在使用三星Galaxy S7,并检查了支持硬件支持的密钥库。(设置 ->安全性 ->凭据存储 ->存储类型)

然后,我尝试生成一个新的私钥,并使用KeyInfo的IsinsideSecureHardware进行检查,但它返回false。我发现在'/data/data/data/杂项/键盘/user_0/'目录中生成了一组相关文件。

为什么不存储硬件(TEE)中的密钥?以及如何在硬件安全钥匙室中生成密钥?

这是我的代码:

KeyPairGenerator kpg = KeyPairGenerator.getInstance(this.algorithm, "AndroidKeyStore");
Builder kpgparams = (new Builder(keyname, 6)).setAlgorithmParameterSpec(new ECGenParameterSpec(this.curve)).setDigests(new String[]{"SHA-256"}).setUserAuthenticationRequired(false).setUserAuthenticationValidityDurationSeconds(300);
kpg.initialize(kpgparams.build());
KeyPair kp = kpg.generateKeyPair();
:
KeyFactory factory = KeyFactory.getInstance(privateKey.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(privateKey, KeyInfo.class);
boolean secure = keyInfo.isInsideSecureHardware();

感谢您的任何帮助。

我可以看到有关如何创建键的差异。我已经创建了以下密钥。

public static boolean createKey(Context context) {
    try {
        // Create new key if needed
        if (!isKeyPresent()) {
            Log.d(TAG, "Creating new KEY. KEY ALIAS NOT FOUND");
            Calendar start = Calendar.getInstance();
            Calendar end = Calendar.getInstance();
            end.add(Calendar.YEAR, 10);
            KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
                    .setAlias(KEY_ALIAS)
                    .setSubject(new X500Principal("CN=" + KEY_ALIAS + ", O=Android Authority"))
                    .setSerialNumber(BigInteger.ONE)
                    .setStartDate(start.getTime())
                    .setEndDate(end.getTime())
                    .build();
            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", KEYSTORE_TYPE);
            generator.initialize(spec);
            generator.generateKeyPair();
            return true;
        } else {
            Log.d(TAG, "KEY ALIAS Exists");
            return false;
        }
    } catch (Exception e) {
        Log.e(TAG, Log.getStackTraceString(e));
    }
    return false;
}

然后验证了该设备是否具有下面的硬件支持的键盘。

public static boolean isHardwareBackedKeyStore() {
    if (android.os.Build.VERSION.SDK_INT < 23) {
        return KeyChain.isBoundKeyAlgorithm(KeyProperties.KEY_ALGORITHM_RSA);
    } else {
        try {
            KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
            keyStore.load(null);
            PrivateKey privateKey = (PrivateKey) keyStore.getKey(KEY_ALIAS, null);
            KeyFactory keyFactory = KeyFactory.getInstance(privateKey.getAlgorithm(), "AndroidKeyStore");
            KeyInfo keyInfo = keyFactory.getKeySpec(privateKey, KeyInfo.class);
            return keyInfo.isInsideSecureHardware();
        } catch (Exception e) {
            Log.e(TAG, Log.getStackTraceString(e));
        }
    }
    return false;
}

使用常数为

private static final String TAG = "KeyStoreHelper";
private static final String KEY_ALIAS = "MyApp_Key_Alias";
private static final String CIPHER_TYPE = "RSA/ECB/PKCS1Padding";
private static final String KEYSTORE_TYPE = "AndroidKeyStore";

此支票对我来说很好。这可能会对您有所帮助。

注意:您可能已经有了一些更好的解决方案。如果是这样,请在此处发布。

最新更新