使用私钥,RSA-SHA1签名和Android中的md5签名字符串

时间:2013-06-10 13:23:26

标签: android rsa md5 sha1

我需要使用RSA-SHA1签名和.PFX证书的私钥来签名字符串。 这是我的代码:

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

我确实得到了一个漂亮的MD5,但是,我在PHP中做同样的事情,我得到的PHP结果与Android中的不同。我知道PHP的一个是正确的...所以Android版本有什么问题?

我注意到,如果我使用new String(signed)代替bytes2String(signed),即使我使用signed.toString()

,Android结果也会有所不同

我将其用于MD5:https://stackoverflow.com/a/4846511/1176497

来自(Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher)的

和bytes2String:

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 个答案:

答案 0 :(得分:1)

我已经明白了......

我正在使用的md5函数需要一个字符串,但是将其转换为byte [] ...因为我已经有了byte [],所以不需要隐藏它!

现在我得到与PHP相同的结果:)