Überprüfen einer Signatur in java unter Verwendung einer public-key-Zertifikate

Ich bin auf der Suche konvertieren einige C# - code, um das äquivalent in Java.

Den C# - code nimmt einige string-Inhalt und eine Signatur (erstellt mit dem privaten Schlüssel auf einer separaten Maschine) und kombiniert mit dem öffentlichen Schlüssel überprüft er die Signatur entspricht, bietet ein Maß an Gewissheit, dass die Anfrage nicht manipuliert wurde.

  public bool VerifySignature(string content, byte[] signatureBytes, AsymmetricAlgorithm publicKey)
  {
        var hash = new MD5CryptoServiceProvider();

        byte[] dataBuffer = Encoding.ASCII.GetBytes(content);

        var cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write);
        cs.Write(dataBuffer, 0, dataBuffer.Length);
        cs.Close();

        var deformatter = new RSAPKCS1SignatureDeformatter(publicKey);
        deformatter.SetHashAlgorithm("MD5");

        return deformatter.VerifySignature(hash, signatureBytes);
  }

Den öffentlichen Schlüssel selbst ist ein X509-Zertifikat - gebaut aus einem .cer-Datei, gespeichert als Montage-Ressource, d.h.

byte[] data; //data is read from a resource stream.
var publicKey = new X509Certificate2(data, "", X509KeyStorageFlags.MachineKeySet).PublicKey.Key

Was ich Suche zu tun, ist emulieren diese Funktionalität in Java, so kann ich verifizieren, die Signatur erzeugt, indem ein code in C#... habe ich begonnen, die Untersuchung der Krypto-Funktionalität von Java, aber ich bin ein bisschen ein java noob. Hier ist was ich habe kommen mit so weit:

byte[] certContents=null;
byte[] signature=null;
String contents = "abc";

//load cert
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certContents));

//grab public key
RSAPublicKey publicKey = (RSAPublicKey)cert.getPublicKey();

//get sha1 hash for contents        
Mac mac = Mac.getInstance("HmacSHA1");
mac.update(contents.getBytes());                
byte[] hash = mac.doFinal();

//get cipher
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);

//verify signature of contents matches signature passed to method somehow (and this is where I'm stuck)

Kann jemand liefern jede Einblick, wie ich die Signatur überprüfen können - oder bieten Sie links zu einigen Ressourcen, die möglicherweise erklären, die java.crypto und java.Sicherheit.cert-Nutzung besser als der Lauf von der Mühle java-docs.

InformationsquelleAutor Bittercoder | 2009-08-11
Schreibe einen Kommentar