我的代码用于密钥存储区的使用。虽然我正在运行我的应用程序,但它显示了一个异常,即密钥存储区未初始化。
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();
}
答案 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)
?
这将使用默认值初始化密钥库 这对你的榜样来说应该足够了。