簡體   English   中英

如何檢查文件是否為 Java 中的 pkcs#8 DER 格式?

[英]How to check if a file is pkcs#8 DER format in Java?

上傳文件時,我需要檢查文件是否為 Java 中的 pkcs#8 DER 格式,我想也許可以使用 PKCS8EncodedKeySpec 和 getFormat()。

class FileFormatePkcs8{
    public static void main(String[] args) {
    String filename = args[0];
        try {
            File f = new File(filename);
            byte[] encodedKey = new byte[(int)f.length()];
            PKCS8EncodedKeySpec pkcs8Key = new PKCS8EncodedKeySpec(encodedKey);
            if(pkcs8Key.getFormat().equals("PKCS#8")) {
                System.out.println("It's pkcs8.");
            }
            else {
                System.out.println("It's not pkcs8.");
            }
        }
        catch (Exception ex) {
            System.out.println("exception:"+ex.getMessage());
        }
    }

}

所有輸入的文件都會得到“It's pkcs8”。 結果。 我意識到“PKCS8EncodedKeySpec”將創建 pkcs#8 密鑰,但我不知道使用哪個 class 來替換它。

請注意:PKCS#8 和 DER 都需要檢查,所以我認為 org.bouncycastle.openssl.PEMParser 可以忽略。 還是我走錯了路?

首先,您實際上根本沒有讀取文件的內容。 您只需創建一個與文件大小相同的空緩沖區。 由於此緩沖區不包含任何數據,因此非存在數據不是 PKCS8 格式,也不是 JKS 格式,也不是比特幣錢包格式,也不是任何其他格式。 (注意,您可以只使用byte[] data = Files.readAllBytes(Paths.get(filename))而不是多個步驟)。

其次,有兩種 PKCS8 DER 格式

OOTB Java當您知道密鑰適用的算法(RSA、DSA、ECDSA/ECDH 等)時才明顯支持 PKCS8 未加密(清除) PrivateKeyInfo 如果這樣做,只需為該算法調用KeyFactory.getInstance ,然后使用包含(據稱)PKCS8-clear 的PKCS8EncodedKeySpec調用.generatePrivateKey ,如果它返回 PrivateKey 的適當子類(並且不拋出異常),則數據實際上是 PKCS8-clear並且適用於該算法。 如果您不知道算法,但只允許或可能使用有限的一組,您可以簡單地依次嘗試每個算法,看看是否有任何(以及哪個)有效。

否則,您必須自己解析 ASN.1(可能,但很重要),或者使用 BouncyCastle(但不是 PEM 部分):調用org.bouncycastle.asn1.pkcs.PrivateKeyInfo.getInstance(der)並且如果它成功輸入數據要么是 PKCS8 清晰的,要么是非常好的模仿。

對於 PKCS8 加密,Java確實暴露了javax.crypto.EncryptedPrivateKeyInfo 只需在數據上調用構造函數,如果它不拋出數據,則看起來像 PKCS8 加密。 然而,這並沒有檢查這些數據是否可以被解密,並且在解密時實際上是一個私鑰,因為它應該是; 為此,如果您知道密碼,請使用epki.getKeySpec()並結合檢查結果聲稱的 PKCS8-clear 如上所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM