2013-06-10 11 views
5

Ho bisogno di firmare una stringa utilizzando la firma RSA-SHA1 e una chiave privata dal certificato .PFX. Ecco il mio codice:Firma una stringa utilizzando una chiave privata, firma RSA-SHA1 e md5 in Android

String rawString = "1234567890"; 

byte[] signed = null; 

FileInputStream cert = new FileInputStream("/sdcard/cert.pfx"); 

KeyStore keyStore = KeyStore.getInstance("pkcs12"); 
keyStore.load(cert, "cert_password".toCharArray()); 

String alias = keyStore.aliases().nextElement(); 
PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, "cert_password".toCharArray()); 

Signature instance = Signature.getInstance("SHA1withRSA"); 
instance.initSign((PrivateKey)privateKey); 
instance.update(rawString.getBytes()); 
signed = instance.sign(); 

TextView mTextView = (TextView) findViewById(R.id.signed_message); 
mTextView.setText(md5(bytes2String(signed))); 

e io capisco un bel guardare MD5, ma, sto facendo la stessa cosa in PHP anche e il risultato che ottengo con PHP è diverso da quello in Android. So che PHP è corretto ... quindi cosa c'è di sbagliato con la versione di Android?

ho notato che il risultato Android differisce se io uso new String(signed) invece di bytes2String(signed) o anche se io uso signed.toString()

io uso questo per MD5: https://stackoverflow.com/a/4846511/1176497

e bytes2String da (Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher):

private static String bytes2String(byte[] bytes) { 
    StringBuilder string = new StringBuilder(); 
    for (byte b : bytes) { 
     String hexString = Integer.toHexString(0x00FF & b); 
     string.append(hexString.length() == 1 ? "0" + hexString : hexString); 
    } 
    return string.toString(); 
} 
+1

conversioni tra array di byte e la stringa dipendono sempre sul 'charset' –

+0

Sì, grazie ... il problema era nella conversione. risulta che non ho bisogno di convertire il byte [], poiché md5 richiede byte [] –

risposta

1

ho capito fuori ....

la funzione md5 che sto usando richiede una stringa, ma la copre a byte [] ... dal momento che ho già byte [] non c'è bisogno di coprirlo!

Ora ottengo lo stesso risultato in PHP :)