2011-06-27 79 views
1

好後,當我研究了Java的簽名文件,我得出的結論看,您哈希文件和散列連接到實際的文件,執行加密,並將其發送到(例如)服務器。在服務器中,您解密文件,獲取文件,創建它的哈希,如果它的新哈希值等於客戶端的哈希值,則該文件確實是客戶端的哈希值。獲取簽名的數據在簽署

但是現在我必須在我的項目中實現它,我只能找到使用java.security.Signature (like this one)的示例,並且在這些示例中,它們簽署文件,然後將文件和簽名文件發送到驗證而不是僅發送簽名文件。

這是實施它的正確方法嗎?如果不是,最好的方法是什麼?請給一些方向。

回答

1

加密文件和簽名之間沒有任何聯繫。您可以獨立執行其中一項或兩項。

籤,您計算哈希,加密使用私鑰散列值,並與文檔(文件)一起發送的加密哈希值。 要驗證,您計算您收到的文檔的散列值,使用公鑰對加密的散列進行解密,然後比較兩者。如果哈希匹配,簽名被驗證。

由於驗證使用公鑰,任何人都可以驗證簽名。但是隻有擁有私鑰的人(或實體)才能簽名。所以它證明了文件的起源。

除此之外,如果你願意,你可以加密文件。您可以在加密之前或之後簽署文件。這一切都取決於你想要做什麼以及你想保持它的安全性。例如,SSL證書未加密,因爲瀏覽器必須檢查其內容以及簽名。

+0

非常感謝@omrib和@ user384706,但我想知道是否有論文中的圖表,我發現這裏的HTTP發送文件和簽名一起而不是單獨像的方式是什麼://www.lintech。組織/嵌入式/ JaimeWong/signature.gif這裏http://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Digital_Signature_diagram.svg/350px-Digital_Signature_diagram.svg.png –

+0

這真的取決於你。您可以簡單地將簽名追加到文件中,或者使用一些更復雜的結構將其添加到文件中。例如,X.509證書與簽名(和簽名算法)一起發送,而不是作爲兩個單獨的文件嵌入到證書中。但這真的取決於你 - 關於如何發送簽名沒有標準(除了作爲更大的標準的一部分,如X.509)。 –

+0

好的,非常感謝,但是......我如何在Java中追加?這就是我想知道的 –

2

您發佈的鏈接僅顯示一個示例,其中調用
public static boolean verifySig(byte[] data, PublicKey key, byte[] sig)的代碼的後半部分僅驗證創建簽名的代碼的前半部分。
這個想法是,在signer.initVerify(key);你通過簽名者的公鑰,然後調用signer.update(data);對你的認爲的數據進行簽名,然後調用驗證通過它的簽名。
如果您通過的簽名對於您認爲簽名基於的數據有效,那麼驗證將成功。