2012-08-22 221 views
1

我發現了兩個類似的問題,並試圖運行代碼給出的解決方案,因爲那些說的答案沒有爲我工作,所以提出的代碼片段的問題。signature.verify()總是返回False?

  1. signature.verify() Always returns False
  2. Signature.verify() is always returning false

無論是說,答案是沒有工作,所以請不要把這個問題視爲重複

這裏是我的代碼。

import com.sun.org.apache.xml.internal.security.utils.Base64; 
import java.io.FileInputStream; 
import java.security.PublicKey; 
import java.security.Signature; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import xmlread.ReadXMLFile; 


public class CertificateTest { 


    public static void main(String[] sdd) { 

     try{ 
     FileInputStream fin = new FileInputStream("pub.arm"); 
     CertificateFactory f = CertificateFactory.getInstance("X.509"); 
     X509Certificate certificate = (X509Certificate) f.generateCertificate(fin); 
     PublicKey pk = certificate.getPublicKey(); 
     byte[] sign = "Qn/rlJRdZAdlPpu1UmmjE+rup8rv8d6XlS9MngAorzYDXefw0vWEP4eHil3YHoA1JUkoQQOgmw0w0QZFmrQbS33sa2t76iuqXI7EtnAPU798K+hEXP88tsYDWJNJFo9DdhkGltP5dQ02DN030Q1w58aTF+yZFfY1KVOPx2bIoL8=".getBytes(); 

     Signature sig = Signature.getInstance("SHA1withRSA"); 
     sig.initVerify(pk); 
     sig.update(Base64.decode(ReadXMLFile.getString().getBytes())); 

     boolean verifies = sig.verify(Base64.decode(ReadXMLFile.getString().getBytes())); 

     System.out.println("signature verifies: " + verifies); 

     }catch(Exception ex){} 
    } 
} 
+0

那是因爲你的代碼是錯誤的,你要比較base64-的RSA加密的SHA1摘要解碼'ReadXMLFile.getString()'自己。你的意思是做'sig.verify(Base64.decode(sign))'嗎? – oldrinb

+0

其實根據算法,服務器在發送到服務器之前正在對BASE64進行編碼登錄。這就是我在驗證之前解碼它的原因。 –

+0

是的,但問題是您沒有將數據的簽名與'sign'中的數據進行比較。 – oldrinb

回答

1

下面是之前我知道ReadXMLFile.getString不是其完整性正在測試,而是在編碼的簽名本身的數據的解釋。分辨率見our discussion


你的代碼是錯誤的 - 你想比較的base64解碼ReadXMLFile.getString()的RSA加密的SHA1摘要本身。

final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes()); 
sig.update(data); 
boolean verifies = sig.verify(data); 

specification for Signature.update

更新的數據進行簽名或驗證,使用指定的字節數組。

然後,從Signature.verify

驗證傳入的簽名。

現在,您實際上並沒有將簽名數據傳遞到verify!你的意思是做sig.verify(Base64.decode(sign))而不是?

如果您需要進一步論證,發佈pub.arm,我可以證明的工作,正確的代碼:-)

+0

謝謝你的支持。如果我在1小時後發佈arm文件,那會好嗎?因爲我需要通過EoD –

+0

Ashish得到這個工作,只需嘗試'boolean verifies = sig.verify(Base64.decode(sign));'代替你現在有了。如果'sign'是正確的簽名,它應該可以工作。 – oldrinb

+0

試過了。同樣的結果。 –