2012-11-22 68 views
2

我遇到問題,無法解決問題。 我在linux上創建了一個簽名對象,並嘗試在Windows上驗證它並失敗。 相反的方式。如果我呆在一個平臺上,一切都很好。Java Signature無法跨平臺驗證

首先我想到了編碼,所以我開始了一些測試,比如將-Dfile.encoding設置爲不同的標準。但即使我使用UTF-8創建簽名並使用windows-1215驗證它,如果我仍然保持在同一個平臺上,每件事都很好。

的代碼是非常基本的,我只是無法找到問題:

創建簽名:

public void signData(File fileToSign, String outPutFileName)... 
{ 
    Signature dsa = Signature.getInstance("DSA"); 
    dsa.initSign(privateKey); 

    byte[] bytesToSign = FileUtils.readByteArrayFromFile(fileToSign); 
    dsa.update(bytesToSign); 

    byte[] sigData = dsa.sign(); 
    FileUtils.saveByteArrayToFile(outPutFileName, sigData); 
} 

public static void saveByteArrayToFile(String outPutFileName, byte[] bytesToSave)... 
{ 
    FileOutputStream fos = new FileOutputStream(outPutFileName); 
    fos.write(Base64.encodeBase64(bytesToSave)); 
    fos.close(); 
} 

驗證它:

public boolean isVerified(File fileToVerify, File signatureFile)... 
{ 
    byte[] sigData = FileUtils.readByteArrayFromFile(signatureFile); 

    Signature signature = Signature.getInstance("DSA"); 
    signature.initVerify(publicKey); 

    byte[] byteToVerify = FileUtils.readByteArrayFromFile(fileToVerify); 
    signature.update(byteToVerify); 

    return signature.verify(sigData); 
} 

public static byte[] readByteArrayFromFile(File file)... 
{ 
    FileInputStream fis = new FileInputStream(file); 
    byte[] byteArray = new byte[fis.available()]; 
    fis.read(byteArray); 
    fis.close(); 

    return Base64.decodeBase64(byteArray); 
} 

我希望有人可以點我在正確的方向。
謝謝。

隨着親切的問候,

+0

在兩個平臺上編寫相同的簽名,然後執行二進制比較以查看它們的不同之處。 – PearsonArtPhoto

+0

您正在使用的所有IO方法是否遵守'-Dfile.encoding'?請參閱http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding –

+3

爲什麼代碼要在兩段代碼中讀取不同的文件?請注意,即使您尚未讀取所有數據,「InputStream」上的available()也可能返回零。不要用它來檢測你是否從'InputStream'中讀取了所有的東西。使用第一個代碼塊中的方法來讀取數據。 – Jesper

回答

1

我終於找到了解決方案。 問題確實是編碼。現在我只需對數據進行編碼和編碼,一切都很好。 我相應地更新了代碼。