JAVA: 无法解析 java.security.KeyStoreException: 无法识别的密钥库格式
JAVA: Unable to resolve java.security.KeyStoreException: unrecgonized keystore format
我在为我的应用程序编码 class 进行加密时遇到了一些问题。 class 首先检查是否存在空的 KeyStore。此 KeyStore 仅用于存储我的应用程序的对称加密密钥。如果不是,则 运行 将此代码
private void createKeyStore() throws Exception
{
KeyStore newKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
newKeyStore.load(null, password.toCharArray());
newKeyStore.store(outputStream, password.toCharArray());
}
此代码使用默认的 JKS(Java 密钥库)格式创建一个密钥库文件。然后它使用 .store()
函数将所述 KeyStore 文件存储在 outputStream
封装的目录中。创建新的 KeyStore 文件后,它会尝试再次加载它。
private void loadKeyStore() throws Exception
{
keyStore = KeyStore.getInstance(new File(keyStoreAddress), password.toCharArray());
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
问题是每当我尝试加载它时,我都会 运行 进入 KeyStoreException:无法识别的密钥库格式错误。可以在此函数的第一行中找到错误。我不确定为什么 Java 程序无法识别 Java 的默认 JKS 格式,但我想我可能在代码中的某个地方搞砸了。
请指教
注:
我没有使用 KeyTool。我不熟悉 KeyTool 是什么,我不想花时间学习新工具。
我也是密码学编码的新手。如果我的请求听起来很容易解决,请提前致歉。
**编辑 1:**
这是产生错误的完整代码,删除了所有不必要的代码。
import java.security.*;
import java.io.*;
public final class Cryptographer
{
private final String keyStoreAddress = "C:\Users\LeafarYart\Desktop\tempDirectory\lmskeystore";
private final String password = "%x9~SK5XS9xz9zK`";
private KeyStore keyStore;
private InputStream inputStream;
private OutputStream outputStream;
public static void main(String[] args) throws Exception
{
Cryptographer crypt = new Cryptographer();
}
public Cryptographer() throws Exception
{
try
{
setInputStream();
} catch(Exception e)
{
//Intentionally left blank.
}
setOutputStream();
File keyStoreFile = new File(keyStoreAddress);
if (keyStoreFile.exists())
{
loadKeyStore();
} else
{
createKeyStore();
setInputStream();
loadKeyStore();
}
}
private void createKeyStore() throws Exception
{
KeyStore newKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
newKeyStore.load(null, password.toCharArray());
newKeyStore.store(outputStream, password.toCharArray());
}
private void loadKeyStore() throws Exception
{
keyStore = KeyStore.getInstance(new File(keyStoreAddress), password.toCharArray());
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
private void setInputStream() throws FileNotFoundException
{
inputStream = new FileInputStream(keyStoreAddress);
}
private void setOutputStream() throws FileNotFoundException
{
outputStream = new FileOutputStream(keyStoreAddress);
}
}
已解决。我自己想出了问题。正如@user207421 和@dave_thompson_085 提到的,我的错误是没有使用 PKCS12 正确设置 KeyStore
实例。 PKCS12 似乎是唯一 KeyStore
格式 Java 支持而不依赖外部 Provider
进行加密。
我还将 KeyStore 文件设置为扩展名 'ks'。这是所有 KeyStore 文件的扩展名。
感谢所有帮助我调试程序的人。
请看下面的代码。
import javax.crypto.*;
import java.security.*;
import java.io.*;
public final class Cryptographer
{
private final String keyStoreAddress = "C:\Users\LeafarYart\Desktop\tempDirectory\lmskeystore.ks";
private final String password = "%x9~SK5XS9xz9zK`";
private SecretKey key;
private KeyStore keyStore;
public static void main(String[] args) throws Exception
{
Cryptographer crypt = new Cryptographer();
}
public Cryptographer() throws Exception
{
File targetFile = new File(keyStoreAddress);
if(targetFile.exists())
{
loadKeyStore();
}
else
{
createKeyStore();
loadKeyStore();
}
}
//creation and loading of key stores
private void createKeyStore() throws Exception
{
OutputStream outputStream = new FileOutputStream(keyStoreAddress);
keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(null, password.toCharArray());
keyStore.store(outputStream, password.toCharArray());
System.out.println("Key stored created");
}
private void loadKeyStore() throws Exception
{
InputStream inputStream = new FileInputStream(keyStoreAddress);
keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
}
我在为我的应用程序编码 class 进行加密时遇到了一些问题。 class 首先检查是否存在空的 KeyStore。此 KeyStore 仅用于存储我的应用程序的对称加密密钥。如果不是,则 运行 将此代码
private void createKeyStore() throws Exception
{
KeyStore newKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
newKeyStore.load(null, password.toCharArray());
newKeyStore.store(outputStream, password.toCharArray());
}
此代码使用默认的 JKS(Java 密钥库)格式创建一个密钥库文件。然后它使用 .store()
函数将所述 KeyStore 文件存储在 outputStream
封装的目录中。创建新的 KeyStore 文件后,它会尝试再次加载它。
private void loadKeyStore() throws Exception
{
keyStore = KeyStore.getInstance(new File(keyStoreAddress), password.toCharArray());
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
问题是每当我尝试加载它时,我都会 运行 进入 KeyStoreException:无法识别的密钥库格式错误。可以在此函数的第一行中找到错误。我不确定为什么 Java 程序无法识别 Java 的默认 JKS 格式,但我想我可能在代码中的某个地方搞砸了。
请指教
注:
我没有使用 KeyTool。我不熟悉 KeyTool 是什么,我不想花时间学习新工具。
我也是密码学编码的新手。如果我的请求听起来很容易解决,请提前致歉。
**编辑 1:** 这是产生错误的完整代码,删除了所有不必要的代码。
import java.security.*;
import java.io.*;
public final class Cryptographer
{
private final String keyStoreAddress = "C:\Users\LeafarYart\Desktop\tempDirectory\lmskeystore";
private final String password = "%x9~SK5XS9xz9zK`";
private KeyStore keyStore;
private InputStream inputStream;
private OutputStream outputStream;
public static void main(String[] args) throws Exception
{
Cryptographer crypt = new Cryptographer();
}
public Cryptographer() throws Exception
{
try
{
setInputStream();
} catch(Exception e)
{
//Intentionally left blank.
}
setOutputStream();
File keyStoreFile = new File(keyStoreAddress);
if (keyStoreFile.exists())
{
loadKeyStore();
} else
{
createKeyStore();
setInputStream();
loadKeyStore();
}
}
private void createKeyStore() throws Exception
{
KeyStore newKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
newKeyStore.load(null, password.toCharArray());
newKeyStore.store(outputStream, password.toCharArray());
}
private void loadKeyStore() throws Exception
{
keyStore = KeyStore.getInstance(new File(keyStoreAddress), password.toCharArray());
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
private void setInputStream() throws FileNotFoundException
{
inputStream = new FileInputStream(keyStoreAddress);
}
private void setOutputStream() throws FileNotFoundException
{
outputStream = new FileOutputStream(keyStoreAddress);
}
}
已解决。我自己想出了问题。正如@user207421 和@dave_thompson_085 提到的,我的错误是没有使用 PKCS12 正确设置 KeyStore
实例。 PKCS12 似乎是唯一 KeyStore
格式 Java 支持而不依赖外部 Provider
进行加密。
我还将 KeyStore 文件设置为扩展名 'ks'。这是所有 KeyStore 文件的扩展名。
感谢所有帮助我调试程序的人。
请看下面的代码。
import javax.crypto.*;
import java.security.*;
import java.io.*;
public final class Cryptographer
{
private final String keyStoreAddress = "C:\Users\LeafarYart\Desktop\tempDirectory\lmskeystore.ks";
private final String password = "%x9~SK5XS9xz9zK`";
private SecretKey key;
private KeyStore keyStore;
public static void main(String[] args) throws Exception
{
Cryptographer crypt = new Cryptographer();
}
public Cryptographer() throws Exception
{
File targetFile = new File(keyStoreAddress);
if(targetFile.exists())
{
loadKeyStore();
}
else
{
createKeyStore();
loadKeyStore();
}
}
//creation and loading of key stores
private void createKeyStore() throws Exception
{
OutputStream outputStream = new FileOutputStream(keyStoreAddress);
keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(null, password.toCharArray());
keyStore.store(outputStream, password.toCharArray());
System.out.println("Key stored created");
}
private void loadKeyStore() throws Exception
{
InputStream inputStream = new FileInputStream(keyStoreAddress);
keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(inputStream, password.toCharArray());
System.out.println("Key stored loaded");
}
}