我正在尝试在我的应用程序中设置加密的默认域实例。我们的想法是使用具有给定别名的KeyPairGenerator生成密钥,将其存储在AndroidKeyStore中,并在每次需要时使用所述密钥。
我所做的
这是我生成密钥的方式:
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
if (!ks.containsAlias(KEY_ALIAS)) {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 99);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
.setAlias(KEY_ALIAS)
.setSubject(new X500Principal("CN=Example, O=ExampleOrg"))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
generator.initialize(spec);
KeyPair keyPair = generator.generateKeyPair();
}
我正在使用KeyPairGenerator,因为我需要支持api版本18及更高版本。
以下是我在应用程序中设置默认域实例的方法:
RealmConfiguration config = null;
try {
config = new RealmConfiguration
.Builder(this)
.encryptionKey(ks.getKey(KEY_ALIAS, null).getEncoded())
.name("dealmatrix.realm")
.schemaVersion(1)
.build();
其中ks是一个像这样获得的Keystore实例:
Keystore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
什么错了
我的问题是这个表达式:
ks.getKey(KEY_ALIAS, null).getEncoded()
返回null,这可以理解地导致异常。
我在网上看到这是KeyStore系统的预期行为。
如果我确实无法获得存储的加密密钥的字节数组,我应该如何使用所述密钥加密我的领域?
有没有其他方法可以安全地存储加密密钥,以便我可以在我的领域配置中使用它?