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");
    }
}