确定密钥库类型是pkcs12还是jks(以编程方式)

use*_*273 5 java keystore

有没有一种简单的方法来确定java中的密钥库类型?密钥库文件没有扩展,但我知道它可能是jks或pkcs12.

目前我正在使用这样的东西:

public static boolean isJks(File f) throws Exception{   
    KeyStore ks = null;

    FileInputStream fis = null;

    try {
        fis = new FileInputStream(f);
        ks = KeyStore.getInstance("jks");
        ks.load(fis, null);
        return true;
    } catch (IOException e) {
        if(fis != null){
            fis.close();
        }
        fis = new FileInputStream(f);
        ks = KeyStore.getInstance("pkcs12");
        ks.load(fis, null);
        return false;
    } finally {
        if(fis != null){
            fis.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做有更简单的方法吗?如果没有,那么这是要走的路还是应该改进?

use*_*ame 1

您可以按照答案中的说明进行操作。基本上,对于 JKS 密钥库,您可以检查文件开头的几个字节的幻数。预期魔法值是0xFEEDFEED。对于 PKCS12,这不是一件容易的事情,但是您可以检查文件是否是 ASN1 结构,尽管可能存在基于 ASN1 的其他文件格式,因此您加载密钥库的方法实际上可能是更好的方法。