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);
}
我希望有人可以點我在正確的方向。
謝謝。
隨着親切的問候,
在兩個平臺上編寫相同的簽名,然後執行二進制比較以查看它們的不同之處。 – PearsonArtPhoto
您正在使用的所有IO方法是否遵守'-Dfile.encoding'?請參閱http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding –
爲什麼代碼要在兩段代碼中讀取不同的文件?請注意,即使您尚未讀取所有數據,「InputStream」上的available()也可能返回零。不要用它來檢測你是否從'InputStream'中讀取了所有的東西。使用第一個代碼塊中的方法來讀取數據。 – Jesper