2011-11-23 10 views
6

के साथ अलग हस्ताक्षर सत्यापित करने के लिए जावा में BouncyCastle प्रदाता का उपयोग करके मैं एक पृथक हस्ताक्षर (सीएमएस/पीकेसी # 7 हस्ताक्षर) कैसे सत्यापित कर सकता हूं?बीसी

वर्तमान में, मेरी कोड के नीचे संदेश message-digest attribute value does not match calculated value

Security.addProvider(new BouncyCastleProvider()); 

File f = new File(filename); 
byte[] buffer = new byte[(int)f.length()]; 
DataInputStream in = new DataInputStream(new FileInputStream(f)); 
in.readFully(buffer); 
in.close(); 

CMSSignedData signature = new CMSSignedData(buffer); 
SignerInformation signer = (SignerInformation) signature.getSignerInfos().getSigners().iterator().next(); 
CertStore cs = signature.getCertificatesAndCRLs("Collection", "BC"); 
Iterator iter = cs.getCertificates(signer.getSID()).iterator(); 
X509Certificate certificate = (X509Certificate) iter.next(); 

CMSProcessable sc = signature.getSignedContent(); 

signer.verify(certificate, "BC"); 
+0

से पहले संदेश में एस/एमआईएम हेडर जोड़ना है। क्या आपने यहां मिले कोड का परीक्षण किया है: http: //bouncy-castle.1462172.n4.nabble.com/How-to-verify-detached-PKCS7-ignature-with-Stream-content-data-td1464668.html? वर्तमान में, कोई विशेष स्थान नहीं है जहां आप वास्तव में अलग डेटा को खाते में लेते हैं। –

+0

मैं इस मुद्दे को आप जवाब [यहां] पा सकते हैं हल [1] [1]: http://stackoverflow.com/questions/8590426/s-mime-verification-with-x509-certificate/20649242 # 20649242 – Swapnil

उत्तर

0

सत्यापित करने के लिए कुंजी के साथ एक अपवाद फेंकता अलग PKCS7 CMSTypedStream का उपयोग करते हैं, कोड की तरह bellow है:

public void verifySign(byte[] signedData,byte[]bPlainText) throws Exception { 
       InputStream is = new ByteArrayInputStream(bPlainText);    
       CMSSignedDataParser sp = new CMSSignedDataParser(new CMSTypedStream (is),signedData); 
       CMSTypedStream signedContent = sp.getSignedContent();   

       signedContent.drain(); 





        //CMSSignedData s = new CMSSignedData(signedData); 
        Store certStore = sp.getCertificates(); 

        SignerInformationStore signers = sp.getSignerInfos(); 
        Collection c = signers.getSigners(); 
        Iterator it = c.iterator(); 
        while (it.hasNext()) 
        { 
         SignerInformation signer = (SignerInformation)it.next(); 
         Collection certCollection = certStore.getMatches(signer.getSID()); 

         Iterator certIt = certCollection.iterator(); 

         X509CertificateHolder certHolder = (X509CertificateHolder)certIt.next(); 




         if (!signer.verify(new 
      JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(certHolder))) 
         { 
          throw new DENException("Verification FAILED! "); 

         } 
         else 
         { 
          logger.debug("verify success"); 
         } 


        } 
    } 
+0

आप इस कोड से अलग हस्ताक्षर सत्यापित कर सकते हैं: CMSSignedData cms = new CMSSignedData (नया CMSProcessableByteArray (Data_Bytes), Sig_Bytes); – meriem

6

आप अलग हस्ताक्षर को सत्यापित कर सकते हैं

public static boolean verif_Detached(String signed_file_name,String original_file_name) throws IOException, CMSException, NoSuchAlgorithmException, NoSuchProviderException, CertStoreException, CertificateExpiredException, CertificateNotYetValidException{ 

    boolean result= false; 
    Security.addProvider(new BouncyCastleProvider()); 

    File f = new File(signed_file_name); 
    byte[] Sig_Bytes = new byte[(int)f.length()]; 
    DataInputStream in = new DataInputStream(new FileInputStream(f)); 
    in.readFully(Sig_Bytes); 
    in.close(); 

    File fi = new File(original_file_name); 
    byte[] Data_Bytes = new byte[(int)fi.length()]; 
    DataInputStream input = new DataInputStream(new FileInputStream(fi)); 
    input.readFully(Data_Bytes); 
    input.close(); 

    try{ 
     CMSSignedData cms = new CMSSignedData(new CMSProcessableByteArray(Data_Bytes), Sig_Bytes); 
     CertStore certStore = cms.getCertificatesAndCRLs("Collection", "BC"); 
     SignerInformationStore signers = cms.getSignerInfos(); 
     Collection c = signers.getSigners(); 
     Iterator it = c.iterator(); 
     while (it.hasNext()) { 
      SignerInformation signer = (SignerInformation) it.next(); 
      Collection certCollection = certStore.getCertificates(signer.getSID()); 
      Iterator certIt = certCollection.iterator(); 
      X509Certificate cert = (X509Certificate) certIt.next(); 
      cert_signer=cert; 
      result=signer.verify(cert, "BC"); 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
     result=false; 
    } 
    return result; 
} 
+0

जहां सीएमएसएस हस्ताक्षर डेटा वर्ग से आता है? – cgajardo

0

आप जव पा सकते हैं: निम्न कोड से इस पोस्ट के लिए here। ऐसा इसलिए हो रहा है क्योंकि एस/एमआईएमई हेडर मौजूद नहीं होने पर उछाल वाले महल/खुले एसएसएल एस/एमआईएम संदेश का इलाज करते हैं। सिग्नल

संबंधित मुद्दे