android - 如何将来自给定字节的密钥存储在 AndroidKeystore 中?
问题描述
我想将从给定字节数组生成的密钥导入到 Android Keystore。但是引发了一些异常。
有谁知道在这种情况下如何导入密钥?
我尝试了以下代码:
try {
byte[] keyBytes = new byte {0x31,0x32,0x33};
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(signingKey);
ks.setEntry("my_key", entry,
new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
} catch (Exception ex) {
ex.printStackTrace();
}
例外情况如下:
W/System.err: java.security.KeyStoreException: Failed to import secret key. Keystore error code: -6
W/System.err: at android.security.keystore.AndroidKeyStoreSpi.setSecretKeyEntry(AndroidKeyStoreSpi.java:742)
W/System.err: at
android.security.keystore.AndroidKeyStoreSpi.engineSetEntry(AndroidKeyStoreSpi.java:1060)
W/System.err: at
java.security.KeyStore.setEntry(KeyStore.java:1596)
解决方案
我通过确保密钥库支持字节数组的长度来解决此问题。
以下是我修改后的代码,现在可以使用
try {
//32bytes (256bit)
byte[] keyBytes = "0123456789ABCDEF0123456789ABCDEF".getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(signingKey);
ks.setEntry("my_key", entry,
new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
} catch (Exception ex) {
ex.printStackTrace();
}
推荐阅读
- javascript - 如何使用 Axios 捕获 PHP 响应错误
- angular - 如何摆脱 Angular 6 服务中的冗余请求?
- c# - 如何从发送到谷歌群组邮件地址的电子邮件中下载附件
- java - Android在url中发送数组作为参数
- python - Python 请求模块不再工作
- python - 如何从 Numpy Array 中删除/删除异常值
- php - 方法 App\Follower::__toString() 不得抛出异常:错误
- python - Matplotlib:如何获得颜色图的反函数?
- sql - SQL Server XML - 使用列名作为元素名
- javascript - Azure 和 MicrosoftGraph Api 部署抛出“错误:不允许的方法”