密钥库未初始化异常

时间:2014-03-31 12:43:20

标签: java android keystore

我的代码用于密钥存储区的使用。虽然我正在运行我的应用程序,但它显示了一个异常,即密钥存储区未初始化。

                 try {
                        KeyStore ks = KeyStore.getInstance("JKS");
                        pk = ks.getKey("Alias", null);
                        if(pk != null){
                            sendSMS("5556", Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT));
                        }

                    }
                    catch (KeyStoreException e) {
                       e.printStackTrace();
                    }
                    catch(NoSuchAlgorithmException e){
                        e.printStackTrace();
                    }
                    catch (UnrecoverableKeyException e){
                        e.printStackTrace();
                    }


          try {
                    ks.deleteEntry("Alias");
                    ks.setKeyEntry("Alias", privateKey.getEncoded(), null);
                }
                catch (KeyStoreException e) {
                    e.printStackTrace();
                }
                catch(NullPointerException e){
                    e.printStackTrace();
                }

3 个答案:

答案 0 :(得分:2)

您使用变量'ks'超出范围。行

ks.deleteEntry("Alias");
ks.setKeyEntry("Alias", privateKey.getEncoded(), null);

需要与try{

位于同一KeyStore ks = KeyStore.getInstance("JKS");块中

您还需要使用load(..)方法初始化密钥库:http://developer.android.com/reference/java/security/KeyStore.html#load(java.io.InputStream,char [])

使用您的示例代码,即:

try {
    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(null, null);
    pk = ks.getKey("Alias", null);
    if(pk != null){
        sendSMS("5556", Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT));
    }
    ks.deleteEntry("Alias");
    ks.setKeyEntry("Alias", privateKey.getEncoded(), null);
}
catch (KeyStoreException e) {
    e.printStackTrace();
}
catch(NoSuchAlgorithmException e){
    e.printStackTrace();
}
catch (UnrecoverableKeyException e){
    e.printStackTrace();
}

答案 1 :(得分:1)

因为ks是在try块中声明的局部变量。这使得它本地尝试自己并且对任何其他外部块都无法访问。

更改,

try {
        KeyStore ks = KeyStore.getInstance("JKS");

要,

KeyStore ks;
try {
     ks = KeyStore.getInstance("JKS");

当第一次尝试阻止结束时,这将避免将ks推出范围。

答案 2 :(得分:0)

尝试:  ks.load(null)

这将使用默认值初始化密钥库 这对你的榜样来说应该足够了。

相关问题