在Android的Keystore中存储私钥



我需要将一些私人用户的值存储在sharedPreferences中。

我遇到了这篇文章:https://medium.com/@ericfu/securelely-secrets-in-an-android-application-501f030ae5a3

它解释了您要做的大多数事情,但是它似乎缺少有关如何将私钥和公共密钥(对于API< 23(保存到密钥库中的部分。

因此,如果我们拥有API版本18-22,我们会执行以下操作:我们打开一个密钥库

KeyStore keyStore = KeyStore.getInstance(AndroidKeyStore);
keyStore.load(null);

我们生成密钥对

Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 30);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(mContext)
                                .setAlias(KEY_ALIAS)
                                .setSubject(new X500Principal("CN=" + KEY_ALIAS))
                                .setSerialNumber(BigInteger.TEN)
                                .setStartDate(start.getTime())
                                .setEndDate(end.getTime())
                                .build();
KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, AndroidKeyStore);
kpg.initialize(spec);
mEncryptionPair = kpg.generateKeyPair();

现在,我们可以使用公共密钥来加密数据和私钥来解密它。但是,我们需要将密钥室保存到密钥库,然后将其检索。我该怎么做?

我还担心为什么Android Studio显示此行的警告

KeyPairGenerator kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, AndroidKeyStore);

警告:

Field requires API level 23 (current min is 14): android.security.keystore.KeyProperties#KEY_ALGORITHM_RSA

我知道,这个问题太旧了,但是我遇到了同样的问题。如果有人需要

,这是解决方案
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                  spec = new KeyPairGeneratorSpec.Builder(mContext)
                        .setAlias(alias)
                        .setSubject(new X500Principal("CN=" + alias))
                        .setSerialNumber(BigInteger.valueOf(1337))
                        .setStartDate(start.getTime())
                        .setEndDate(end.getTime())
                        .build();
            } else {
                spec = new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_SIGN)
                        .setCertificateSubject(new X500Principal("CN=" + alias))
                        .setDigests(KeyProperties.DIGEST_SHA256)
                        .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                        .setCertificateSerialNumber(BigInteger.valueOf(1337))
                        .setCertificateNotBefore(start.getTime())
                        .setCertificateNotAfter(end.getTime())
                        .build();
            }

最新更新