2009-09-09 153 views
0

我試圖驗證XML簽名。XML數字簽名驗證

根據此tutorial驗證工作正常。

但我也試過第二種方法。與Signature類 的verify method驗證我的手寫簽名,並從XML文件中的證書,我做了以下內容:

public static boolean checkSignedFile(byte[] data, byte[] sigToVerify, 
     byte[] cert, String algorithm) throws CertificateException, 
     NoSuchAlgorithmException, InvalidKeyException, SignatureException { 
    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    Certificate c = (Certificate) cf 
      .generateCertificate(new ByteArrayInputStream(cert)); 
    PublicKey pk = c.getPublicKey(); 
    Signature sig; 
    boolean verifies = false; 
    sig = Signature.getInstance(algorithm); 
    sig.initVerify(pk); 
    sig.update(data); 
    verifies = sig.verify(sigToVerify); 
    return verifies; 
} 

結果爲假。簽名沒有驗證。這可能是什麼原因?

+0

教程鏈接似乎不再適用。 – Yster 2015-04-29 09:52:33

+0

這可能是新的:http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html – Yster 2015-04-29 10:37:44

回答

2

您無法像這樣驗證XMLDsig。它不會工作。簽名不是通過原始XML計算的。它必須經過規範化,消化等。

你對data[]有什麼用?爲了做到這一點,你幾乎必須重寫XMLDsig庫。

+0

data []實際上是經過簽名的文件。我已經檢查過它與xml簽名中的摘要具有相同的摘要。所以文摘是一樣的。這就是爲什麼我很好奇爲什麼驗證不起作用 – iffi 2009-09-09 14:50:00

+0

所以該文件是XMLDsig簽名的XML文件?那麼你會在文件中籤名,對嗎?如果你可以驗證整個文件,會不會是一個雞蛋問題:) – 2009-09-09 15:20:49

+0

我知道現在有點晚了......但你如何使用摘要? – 2012-08-13 16:12:59

0

如果data []是簽名的XML文件的內容,什麼是sigToVerify?

XMLSig創建一個Signature-Element(SignedInfo),其中包含要簽名的每個元素的摘要以及元信息,如使用的規範化/轉換算法。然後這個SignedInfo-Elemnt的摘要被計算和簽名。

因此,如果sigToVerify是由XMLSignature實現創建的簽名,則它不能等於完整XML文件的簽名。

Here是一個更完整的解釋。如果你有興趣,看看specification