【发布时间】:2019-12-04 07:04:10
【问题描述】:
我想将我的 AES-256 密钥存储到 AndroidKeyStore,这个 AES-256 密钥是原始密钥(随机 32 字节)。我尝试了一些这样的代码。
public foo () {
SecureRandom sr = new SecureRandom();
byte[] key = new byte[32];
sr.nextBytes(key);
try {
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
SecretKeySpec sks = new SecretKeySpec(key, "AES");
SecretKeyFactory skf = SecretKeyFactory.getInstance("AES");
SecretKey sk = skf.generateSecret(sks);
ks.setEntry("key", new KeyStore.SecretKeyEntry(sk), new
KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT).build());
KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry) ks.getEntry("key", null);
SecretKey skLoad = (SecretKey) ks.getKey("key", null);
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skLoad);
Log.i(TAG, Arrays.toString(cipher.doFinal(plainBytes)));
} catch (Exception e) {
e.printStackTrace();
}
}
我在 SecretKey sk = skf.generateSecret(sks); 行得到了异常;
java.security.spec.InvalidKeySpecException: To generate secret key in Android Keystore, use KeyGenerator initialized with android.security.keystore.KeyGenParameterSpec
我知道我们可以使用 KeyGenerator 和 KeyGenParameterSpec 来保存密钥,但我有一些理由使用所有者密钥,而 KeyGenParameter 似乎无法导入我的所有者密钥。所以对这个问题有什么想法,谢谢大家!
【问题讨论】:
标签: android cryptography aes