我已经创建了一个密钥库,签署了apk并将其发布到Play商店.
现在我已经修复了一些错误,使用相同的密钥库和密码,然后在导出android应用程序向导中单击下一步.
它显示了别名的下拉框,上面没有别名.但昨天同样的事情对我来说也是有用的,我签了同样的项目,现在看起来很空洞.
我也在命令行上尝试了它,但它说"密钥库被篡改或密码不正确",但我非常确定密码ID是正确的,密钥库也是如此.
这对我来说是个绝佳的噱头.请帮忙!
当我使用我的密钥库时,我收到以下错误:
$ keytool -list -keystore instavert.keystore
keytool error : java.security.cert.CertificateParsingException: java.io.IOException: Parse Generalized time, invalid format
Run Code Online (Sandbox Code Playgroud)
我搜索了谷歌和SO,但没有一个解决方案有效...
有没有人遇到过同样的问题?
在我的应用程序中,当用户使用OAuth成功进行身份验证时,我需要存储REST API返回的访问令牌.我正在考虑使用密钥库来存储此令牌,以便在应用程序中进一步使用.但到目前为止,我还没有看到使用android密钥库API存储已生成密钥的实现.是否有任何存储已生成令牌的示例或代码段.
此外,如果我使用密钥库来存储访问令牌,那么有根电话的用户是否可以访问这些令牌?
谢谢.
KeyInfo 的 isInsideSecureHardware-method 的返回值似乎取决于设备型号、操作系统版本和其他一些随机因素。
例如,当使用 Sony xperia z5 compact 和较旧的操作系统版本时,isInsideSecureHardware() 可能会在一段时间内返回 true,然后突然开始为相同的私钥返回 false。使用最新的操作系统版本 (32.2.A.0.224) 似乎只返回 false。华为 Nexus 6P 返回始终为真。
有没有办法确保密钥存储在安全硬件中?
这是我当前的代码:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setUserAuthenticationRequired(true)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// Check that private key is inside secure hardware
KeyFactory factory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(key, KeyInfo.class);
boolean secure = keyInfo.isInsideSecureHardware(); // this usually returns false
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:在索尼支持论坛上有一个关于同样问题的话题:https : //talk.sonymobile.com/t5/Android-development/hardware-backed-keystore/td-p/1154124
有人提到以下警告会打印到日志中:
W 密钥库:主 keymaster 设备无法生成密钥,回退到 SW。
我正在尝试编写一些针对Android Keystore的测试用例.但是,当我编写以下测试用例时:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class FancyPantsUnitTest {
@Test
public void buildKey() {
keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
keyPairGenerator.initialize(4096);
final KeyPair keyPair = keyPairGenerator.generateKeyPair();
}
}
Run Code Online (Sandbox Code Playgroud)
这失败,出现以下异常:
org.junit.ComparisonFailure: expected:<null> but was:<java.security.KeyStoreException: AndroidKeyStore not found>
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我的目标是API等级23.
在一个应用程序中,我使用Android KeyStore.我已经为整个KeyStore和每个密码条目设置了密码.由于这些密码是字符串,因此它们存储在代码中的字符串成员中
如果我想发布应用程序,这显然不安全,因为潜在的攻击者可以反编译apk并获取密码,因为它在应用程序中是硬编码的.
我的问题是:
编辑以进行清除:我不是谈论应用程序签名,而是关于将密码密钥存储在受密码保护的Android KeyStore中.应用程序必须在运行时访问密码才能检索密钥条目.
当前代码示例:
String keyStorePwd = "password1";
String keyEntryPwd = "password2";
FileInputStream fis = getApplicationContext().openFileInput("sms.keystore");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(fis, keyStorePwd.toCharArray());
SecretKey key = (SecretKey) ks.getKey("aes_key_sms_notifier", keyEntryPwd.toCharArray());
fis.close();
Run Code Online (Sandbox Code Playgroud) 介绍
我目前正在研究一种使用Android Keystore新功能的解决方案(自Marshmallow,API级别23以来).我的应用程序使用Java和C++(NDK),我有一些需要从本机代码执行的关键操作.
我能够正确使用Java中的新Keystore.
不幸的是,Android C++源代码没有记录,我试图调查它.
题
我想从Java和C++执行操作.我可以使用和接口的唯一动态库是IKeystoreService及其关联的库/system/lib/libkeystore_binder.so.
我已经能够包含标题和库并编译它.但由于我可以使用的唯一连接点是Java和C++ IKeystoreService之间的Binder,我无法找到我应该使用哪些数据来实现简单的AES加密(例如).
有人有任何见解吗?
谢谢
据我所知,这10 years是在 Eclipse 中创建密钥库时的默认设置。我认为,大约 5 年前,Android 开发成为主流,因此我预计 5 年后,Play 商店中的许多应用程序将无法更新。
到目前为止,我还没有找到关于如何“延长”证书生命周期的解决方案。有吗?Google 会实施一种方法来使用新证书设置您的应用吗?当然,我的场景不会影响太多的应用程序,但我认为在 3-5 年内会有相当多的 SO 问题。
有任何想法吗?
只是想知道应用程序设置中的清除数据是否会清除存储在该特定应用程序中的所有 Android 密钥库?或者它留下了某些数据位?
我所指的 Android Keystore 类似于这个 KeyStore。请参阅下面的教程。
当我提示指纹对话框验证用户身份时,我在崩溃日志中看到了很多。
java.security.UnrecoverableKeyException: Failed to obtain information about key at
..my code..
io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:287) at
io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172) at
io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255) at
io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119) at android.os.Handler.handleCallback(Handler.java:873) at
android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:214) at
android.app.ActivityThread.main(ActivityThread.java:6981) at
java.lang.reflect.Method.invoke(Native Method) at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Caused by: java.security.UnrecoverableKeyException: Failed to obtain information about key at
android.security.keystore.AndroidKeyStoreProvider.getKeyCharacteristics(AndroidKeyStoreProvider.java:238) at
android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:360) at
android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:116) at java.security.KeyStore.getKey(KeyStore.java:1062) at
Caused by: android.security.KeyStoreException: 112 at
android.security.KeyStore.getKeyStoreException(KeyStore.java:1147) at
android.security.keystore.AndroidKeyStoreProvider.getKeyCharacteristics(AndroidKeyStoreProvider.java:240) ... 34 more
Run Code Online (Sandbox Code Playgroud)
这是什么KeystoreException:112,这会导致什么?我正在尝试有机地重现该错误,但一直无法。
android ×10
android-keystore ×10
keystore ×3
security ×2
access-token ×1
android-ndk ×1
c++ ×1
database ×1
google-play ×1
java ×1
passwords ×1
private-key ×1
robolectric ×1