2014-02-19 18 views
0

我想表明,如果我修改了给定X509证书中的一个位或字节,则签名验证结果为false(因为此修改会导致证书中的不同哈希值)。我陷入了如何使用getTBSCertificate()方法对证书进行修改的情况。我的下面的代码完全验证过程,但我试图使它失败,使用位或字节修改的想法,但它不起作用。需要注意的是这种想法,我建议是要证明,证书上的任何修改将使故障而签名验证如何更新getTBSCertificate()方法

public class VerifyX509 { 
private static Certificate getCACert; 
private static Certificate[] getCert; 

public static void main(String[] args) throws CertificateEncodingException { 
    setURLConnection("https://www.google.com"); 
    X509Certificate x509cert= (X509Certificate) getCert[0]; 
    byte[] b= x509cert.getTBSCertificate(); 
    b[0] = (byte) ~b[0]; 
    // HOW TO UPDATE getTBSCertificate() after flipping the b[0] to make Verify() in my method verifySign() return false! 
    verifySign(); 

    } 


public static void setURLConnection(String link){ 

    try{ 
     int i=1; 
     URL destinationURL = new URL(link); 
     HttpsURLConnection con = (HttpsURLConnection) destinationURL.openConnection(); 
     con.connect(); 
     getCert = con.getServerCertificates(); 
     for (Certificate c : getCert) 
     { 
      if (i==2) 
      { 
       getCACert= c; 
       return; 
      } 
      i+=1; 
     } 
     }catch (Exception e1) { 
     JOptionPane.showMessageDialog(null, "Error while connection! Check your Internet Connection."); 
     e1.printStackTrace(); 
     } 

} 


public static boolean verifySign() 
{ 

     try 
     { 
      getCert[0].verify(getCACert.getPublicKey()); 
      return true; 
     } catch (GeneralSecurityException e2) 
     { 
      return false; 
     } 
} 

}

+0

您是否在尝试进行某种测试?为什么不扩展证书? – ITomas

+0

是的,这是一个测试。但我需要显示反例时,有人翻转或更改证书中的任何位,verify()必须返回false – user3317181

+0

因此,也许扩展证书和重新实现getTBSCertificate,所以添加setter方法将工作? – ITomas

回答

0

所有您需要做的是让行数据DER编码证书信息(TBS部分),你可以提取它下面

URL url = new URL("https://www.google.com/"); 
HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
con.connect(); 
Certificate userCert[] = con.getServerCertificates(); 
     X509Certificate x509cert = ((X509Certificate) userCert[0]); 


    byte[] tbs=x509cert.getTBSCertificate(); 

则数组的内容b。通过循环复制到另一个阵列BCOPY和你什么都想要修改(使用屏蔽技术安定即与x55)后,你可以通过

String sha1 = ""; 
MessageDigest crypt = MessageDigest.getInstance("SHA-1"); 
     crypt.reset(); 
     crypt.update(bcopy); 
     sha1 = byteToHex(crypt.digest()); 

private static String byteToHex(final byte[] hash) 
{ 
    Formatter formatter = new Formatter(); 
    for (byte b : hash) 
    { 
     formatter.format("%02x", b); 
    } 
    String result = formatter.toString(); 
    formatter.close(); 
    return result; 
} 

在这一点上,你必须修改证书的哈希值,得到的哈希值,你现在可以走了,并提取原始凭证[byte[] sig= x509cert.getSignature();]签名和对签名进行解密,以获得哈希值并将其与修改后的散列值进行比较,祝你好运;)