java中secretkey,java-在SecretKey上调用.getEncoded()返回null

我使用以下代码生成AES密钥:

KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder("db_enc_key", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT);

KeyGenParameterSpec keySpec = builder

.setKeySize(256)

.setBlockModes("CBC")

.setEncryptionPaddings("PKCS7Padding")

.setRandomizedEncryptionRequired(true)

.setUserAuthenticationRequired(true)

.setUserAuthenticationValidityDurationSeconds(5 * 60)

.build();

KeyGenerator keyGen = KeyGenerator.getInstance("AES", "AndroidKeyStore");

keyGen.init(keySpec);

SecretKey sk = keyGen.generateKey();

但是每次我尝试通过sk.getEncoded()获取密钥的byte []版本时,该方法都会返回null.该文档说应该返回编码后的密钥,如果该密钥不支持编码,则返回null,但是我不认为该密钥不支持编码.

我需要byte [],因为我想加密一个领域数据库(为此我需要将2个AES-256密钥组合为字节数组)[https://realm.io/docs/java/latest/#encryption]

官方文档使用SecureRandom,但也指出这样做是一种愚蠢的方式,并且永远不会存储密钥.因此,我想使用KeyStore安全地存储两个单独的AES-256密钥.

附注:该代码仅是测试代码,而不是最终产品,因此对编码样式的任何评论都是无用的.我目前正试图获得一个工作版本.

编辑:因此,我尝试了以下代码,该代码成功生成了AES密钥(尽管只有16个字节的长度):

SecretKey sk1 = KeyGenerator.getInstance("AES").generateKey();

当我在其上使用getEncoded()方法时,我什至会得到字节数组,因此自然地我继续使用以下代码将其保存到KeyStore中:

KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(sk1);

KeyStore.ProtectionParameter pp = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT).build();

keyStore.setEntry("db_enc_key_test", entry, pp);

这也有效.因此,我尝试通过KeyStore.Entry entry2 = keyStore.getEntry(“ db_enc_key_test”,null);从密钥库中读取密钥.效果也不错.但是,当我调用entry2.getEncoded()时,该方法再次返回null.这是密钥库问题吗?

edit2:所以我才发现,在密钥库中生成的对称密钥(显然已经保存到该密钥)在Android M中是不可导出的,这似乎是故意的,这使我有点问题,因为我需要密钥本身加密领域数据库.

这里有一些领域开发人员推荐最佳实践吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值