- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有以下几行从 Android 上的 keystore 中获取私钥
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
// generating key pair code omitted
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) this.keyStore.getEntry("alias", null);
一切正常,除了当操作系统从 Android 5.1.1 升级到 Android 6.0.1 时,第 3 行将抛出 java.security.UnrecoverableKeyException: Failed to get information about private key
非常第一次执行。但之后它会再次正常工作。现在我的解决方法是执行该行 2 次。同时,我也想知道是否有更好的方法来避免异常。
异常跟踪
W/System.err﹕ java.security.UnrecoverableKeyException: Failed to obtain information about private key
W/System.err﹕ at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:217)
W/System.err﹕ at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:253)
W/System.err﹕ at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:263)
W/System.err﹕ at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:93)
W/System.err﹕ at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:372)
W/System.err﹕ at java.security.KeyStore.getEntry(KeyStore.java:645)
W/System.err﹕ at com.example.keystoretest.MainActivity.onCreate(MainActivity.java:113)
W/System.err﹕ at android.app.Activity.performCreate(Activity.java:6251)
W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
W/System.err﹕ at android.app.ActivityThread.-wrap11(ActivityThread.java)
W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err﹕ at android.os.Looper.loop(Looper.java:148)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/System.err﹕ Caused by: android.security.KeyStoreException: Invalid key blob
W/System.err﹕ at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
W/System.err﹕ at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:218)
W/System.err﹕ ... 18 more
最佳答案
Ans:在加载 Android key 并从 Keystore 存储公钥时,如果状态被锁定或未初始化,则可能会发生此错误。
@NonNull
public static AndroidKeyStorePublicKey loadAndroidKeyStorePublicKeyFromKeystore(
@NonNull KeyStore keyStore, @NonNull String privateKeyAlias)
throws UnrecoverableKeyException {
KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
int errorCode = keyStore.getKeyCharacteristics(privateKeyAlias, null,
null, keyCharacteristics);
if (errorCode != KeyStore.NO_ERROR) {
throw (UnrecoverableKeyException) new UnrecoverableKeyException(
"Failed to obtain information about private key")
.initCause(KeyStore.getKeyStoreException(errorCode)); // this exception is generated
}
......
......
......
}
KeyStore 有 10 个响应码。他们是
// ResponseCodes
NO_ERROR = 1;
LOCKED = 2;
UNINITIALIZED = 3;
SYSTEM_ERROR = 4;
PROTOCOL_ERROR = 5;
PERMISSION_DENIED = 6;
KEY_NOT_FOUND = 7;
VALUE_CORRUPTED = 8;
UNDEFINED_ACTION = 9;
WRONG_PASSWORD = 10;
KeyStore has 3 states. They are UNLOCKED, LOCKED, UNINITIALIZED
NO_ERROR is only happened when the state is UNLOCKED. For your upgrading case the state is LOCKED or UNINITIALIZED for first time, so the error is happened only once.
public State state() {
execute('t');
switch (mError) {
case NO_ERROR:
return State.UNLOCKED;
case LOCKED:
return State.LOCKED;
case UNINITIALIZED:
return State.UNINITIALIZED;
default:
throw new AssertionError(mError);
}
}
资源链接:
从您的错误日志中,现在很明显
W/System.err﹕ Caused by: android.security.KeyStoreException: Invalid key blob
这是用户尝试从 LOCK/UNINITIALIZED 解锁时引起的主要问题。默认情况下定义为 30 秒计时。 这个问题是API相关的实现问题。
/**
* If the user has unlocked the device Within the last this number of seconds,
* it can be considered as an authenticator.
*/
private static final int AUTHENTICATION_DURATION_SECONDS = 30;
对于加密/解密,使用生成的 key 的某些数据仅在用户刚刚通过设备凭据进行身份验证时才有效。错误发生在
// Try encrypting something, it will only work if the user authenticated within
// the last AUTHENTICATION_DURATION_SECONDS seconds.
cipher.init(Cipher.ENCRYPT_MODE, secretKey); // error is generated from here.
从这里抛出实际错误。您的错误是由 InvalidKeyException
生成的。
您必须从 catch 参数中删除 InvalidKeyException
类。这仍然允许您检查 InvalidKeyException
。检查后,您必须第二次尝试使用代码,以便问题不会显示在眼睛中,但进行 2 次检查可能会解决您的问题。我没有测试过代码,但应该如下所示:
try {
....
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) this.keyStore.getEntry("alias", null);
....
} catch (final Exception e) {
e.printStackTrace();
if (e instanceof InvalidKeyException) { // bypass InvalidKeyException
.......
// You can again call the method and make a counter for deadlock situation or implement your own code according to your situation
if (retry) {
keyStore.deleteEntry(keyName);
return getCypher(keyName, false);
} else {
throw e;
}
}
}
关于java.security.UnrecoverableKeyException : Failed to obtain information about private key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652675/
这是我的第一个主题here的继续,该主题是有关如何使用代码模拟屏幕触摸的。 我想将此功能整合到 float 的屏幕聊天头中(就像facebook所做的那样)。因此,基本上,当我点击聊天头时,此服务将模
安装应用程序时遇到以下问题: 使用Worklight控制台,我正在上载.wlapp文件,删除已部署的应用程序,然后尝试再次上载相同的.wlapp。 然后,Worklight Console被卡住,甚至
我进行了 LDAP 目录搜索并收到了一些结果。我需要迭代这些结果并显示每个条目的 Dn。 在我的测试环境中,我通过获取entryDN属性的值来返回Dn值。 在生产环境中,entryDN 属性始终返回
在调试器中,当执行这样一行代码时我“卡住”了:lock (myvar) 显然其他人持有myvar。但是我希望在这一行 myvar 应该是免费的。所以我想知道代码的哪一部分包含 myvar (来自另一个
我正在做一些序列化,其中还包含需要存储为字符串的 IFile 路径。 我在插件项目中使用这个 IFile。为调试或运行 Eclipse 启动一个新工作区。这个测试工作区的根目录相对于插件文件夹。我的问
我知道这个问题已经得到回答,但我不明白人们到底在做什么(关于证书,ssl),他们都使用本地主机而不是我。 我使用此示例作为示例 OpenIdConnect 我正在使用: 一个网络应用程序 一个 Web
我正在尝试获取当前星期以在SQLite中进行日期比较。 我上个月,去年,今天,昨天都没问题...但是找不到当前星期的解决方案。 我尝试了很多事情,例如: SELECT tastings.* FROM
我有兴趣将大部分使用Thrust GPU库编写的代码移植到多核CPU。值得庆幸的是,the website说推力代码可以与诸如OpenMP/Intel TBB之类的线程环境一起使用。 我在下面编写了一
我需要创建一个 PHP 应用程序,在给定主题标签的情况下,它会向我返回一个 XML,其中包含与该主题标签相关的帖子。 我在开发者部分登录 Instagram 并填写了应用程序设置表格。 已生成“客户端
当我从 Gradle 任务运行集成测试时,我的集成测试失败。 org.springframework.data.solr.UncategorizedSolrException: **SolrCore
这个问题已经有答案了: java.lang.IllegalStateException: Iterator already obtained (1 个回答) 已关闭 8 年前。 所以我写了一个小Jav
谁能告诉我为什么会出现以下异常? java.rmi.ServerException: RuntimeException; nested exception is: java.lang.Ille
当我尝试从 WCF 测试客户端运行我的应用程序时,我收到以下错误: Error: Cannot obtain Metadata from http://localhost:53867/MyAPI.sv
我有几个变量分配给同一个函数。属性“name”为“”,因为此函数是匿名的; 也没有涉及函数调用,因此没有被调用者。 JS有没有办法通过自己实现的反射算法获取变量名? 例如 var x = functi
只是想知道是否有人知道如何查询 Facebook Credits (FBC) API 以获取用户拥有的信用数?我的应用程序有此要求,并且 FBC API 中没有对此进行解释或提及。 谢谢 最佳答案 也
我正在使用 Spring Batch 3.0.5。关于 MySql 序列表的引擎类型的相同问题。与 spring-batch-storage-engine-as-myisam-than-innodb
我想我遗漏了一些明显的东西,但我就是想不通如何获取 CCMenuItemFont 的标签。 背景我正在为 iPad 构建一个简单的刽子手游戏。为了输入下一个猜测,我在 UI 中添加了 26 个按钮(每
我正在开发一个 Android 应用程序 (API 15) 并在尝试编写单元测试时遇到以下问题: 我使用 android.os.Parcel 来保存一个类(例如,如果屏幕翻转)并将它发送到另一个 Ac
我正在利用 C++ 全局变量的构造函数的行为在启动时以简单的方式运行代码。这是一个非常简单的概念,但有点难以解释,所以让我粘贴代码: struct _LuaVariableRegistration {
在 C# 中,如何获取对给定类的基类的引用? 例如,假设您有一个特定的类 MyClass,并且您想要获取对 MyClass 的父类(super class)的引用。 我的想法是这样的: Type s
我是一名优秀的程序员,十分优秀!