相关疑难解决方法(0)

Android密钥库错误"无法在密钥库中生成密钥"

尝试为某些设备生成密钥时出错.我能够在运行4.4.2的三星Galaxy Note上重现错误.

java.lang.IllegalStateException: could not generate key in keystore
        at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:100)
        at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:275)
        at com.eric.demo.MainActivity.generateKeyPair(MainActivity.java:65)
        at com.eric.demo.MainActivity.onClickButton(MainActivity.java:43)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.view.View$1.onClick(View.java:3964)
        at android.view.View.performClick(View.java:4640)
        at android.view.View$PerformClick.run(View.java:19421)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5476)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
        at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我创建了一个小应用程序,只通过从Android开发者页面https://developer.android.com/training/articles/keystore.html "生成新私钥"下逐行复制代码来生成密钥.

 public void onClickButton (View view) {
    try {
        generateKeyPair(this, "test3");
    } catch (Exception e){
        Log.wtf("exception", e);
    }
}

private void generateKeyPair(Context context, String alias)
    throws Exception { …
Run Code Online (Sandbox Code Playgroud)

java android runtime-error android-keystore

39
推荐指数
1
解决办法
3780
查看次数

无法在Android密钥库中生成密钥

我们目前遇到的问题是,当用户安装我们的应用程序时,应用程序会尝试访问并在密钥库中生成密钥,但密钥库会抛出此异常:

Caused by: java.lang.IllegalStateException: could not generate key in keystore
        at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:100)
        at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:275)
Run Code Online (Sandbox Code Playgroud)

我们认为它与手机上的解锁模式有关,无法解锁密钥库,和/或设备管理员锁定密钥库.

这是密钥库的创建方式以及密钥的生成方式:

public SecretKeyWrapper(Context context, String alias) throws GeneralSecurityException, IOException {
    mCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    final KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
    keyStore.load(null);

    if (!keyStore.containsAlias(alias)) {
        generateKeyPair(context, alias);
    }

    final KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null);
    mPair = new KeyPair(entry.getCertificate().getPublicKey(), entry.getPrivateKey());
}

private static void generateKeyPair(Context context, String alias) throws GeneralSecurityException {
    final Calendar start = new GregorianCalendar();
    final Calendar end = new GregorianCalendar();
    end.add(Calendar.YEAR, 100);

    final KeyPairGeneratorSpec spec …
Run Code Online (Sandbox Code Playgroud)

java security android keystore android-keystore

22
推荐指数
1
解决办法
4498
查看次数

Android Keystore getEntry()和generateKeyPair()有时会抛出异常

我的Android应用程序需要加密文件,以便以后可以解密和读取.除了应用程序,甚至用户之外,其他任何人都无法解密.

以下是我如何进行加密和解密.这在大多数情况下都有效,但有些用户有时会失败.它不是特定的手机(Nexus7,三星,摩托罗拉,HTC - 所有类型都报告此问题),但并非所有用户都遇到它.偶尔只有一些用户.

这是相关代码:

encrypt() {
   KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
   final KeyStore.PrivateKeyEntry entry;
   if (!ks.containsAlias(CERT_ALIAS)) {
       Calendar cal = Calendar.getInstance();
       Date now = cal.getTime();
       cal.add(Calendar.YEAR, 50);
       Date end = cal.getTime();
       KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
       kpg.initialize(new KeyPairGeneratorSpec.Builder(getApplicationContext())
              .setAlias(CERT_ALIAS)
              .setStartDate(now)
              .setEndDate(end)
              .setSerialNumber(BigInteger.valueOf(1))
              .setSubject(new X500Principal("CN=" + CERT_ALIAS))
              .build());
       KeyPair kp = kpg.generateKeyPair();
   }
   entry = (KeyStore.PrivateKeyEntry) ks.getEntry(
                     CERT_ALIAS, null);
   pub = entry.getCertificate().getPublicKey();
   // use the pub key to encrypt
}
decrypt() {
    KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
    ks.load(null);

    final KeyStore.PrivateKeyEntry entry = …
Run Code Online (Sandbox Code Playgroud)

java security android

19
推荐指数
1
解决办法
5149
查看次数

更改密码后,KeyStore getEntry返回null

嗨,我有一个程序,需要在密钥库中存储密钥,我生成一对密钥,我签署一个值,这一切都很有效.当用户转到首选项并更改密码或将密码模式更改为引脚模式时,问题就出现了.之后,当我尝试访问私钥时,密钥库返回给我一个空值.

我知道keysotore值是用解锁密码值签名的,但我相信如果用户更改了密码,密钥库将使用新密钥进行签名,但事实并非如此.

我做错了什么?如果不是这样,有没有办法改变密码并手动进行?

这是我正在使用的代码.

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(context)
        .setAlias(ALIAS)
        .setStartDate(now)
        .setEndDate(end)
        .setSerialNumber(BigInteger.valueOf(1))
        .setSubject(new X500Principal("CN=test1"))
        .build());

KeyPair kp = kpg.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

这是获取密钥库的代码

    KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
    ks.load(null);
    KeyStore.Entry entry = ks.getEntry(ALIAS, null);
    if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
        Log.w("borrar", "Not an instance of a PrivateKeyEntry");
        return null;
    } 
Run Code Online (Sandbox Code Playgroud)

谢谢,

android keystore

10
推荐指数
0
解决办法
1242
查看次数