Domanda

Sto cercando di convertire qualche codice C # per l'equivalente in Java.

Il codice C # richiede un po 'contenuto della stringa, e una firma (generata utilizzando la chiave privata, su una macchina separata) e combinato con la chiave pubblica che verifica la firma corrisponde, fornendo un livello di garanzia che la richiesta non sia stato manomesso con.

  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);
  }

La chiave pubblica è di per sé un certificato X509 - costruito da un file cer, cioè memorizzati come risorsa di montaggio

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

Quello che sto cercando di fare è di emulare questa funzionalità in Java, in modo da poter verificare la firma generata da un certo codice in C # ... Ho iniziato a studiare la funzionalità di crittografia di Java, ma io sono un po 'di un noob java. Ecco cosa mi è venuta in mente finora:

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)

Qualcuno può fornire un'idea di come posso verificare la firma -. O fornire link ad alcune risorse che potrebbero spiegare l'utilizzo java.crypto e java.security.cert meglio allora il percorso dei documenti mulino java

È stato utile?

Soluzione

Questo codice C # sembra davvero confuso per me. Si usa SHA1CryptoServiceProvider ma utilizza MD5 hash, quindi non posso dire quale algoritmo di hashing che sta utilizzando. Penso che sia MD5.

Il processo di verifica della firma comporta imbottitura in modo che il codice non avrebbe funzionato. In seguito è una certa frammento dal mio codice e si può utilizzare per verificare la firma. i dati sono i byte di firmare e sigBytes detiene la firma.

String algorithm = "MD5withRSA";

// Initialize JCE provider    
Signature verifier = Signature.getInstance(algorithm);

// Do the verification   
boolean result=false;

try {
    verifier.initVerify(cert); // This one checks key usage in the cert
    verifier.update(data);
    result = verifier.verify(sigBytes);
}
catch (Exception e) {
    throw new VerificationException("Verification error: "+e, e);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top