比较android(java)和c#中的md5哈希

时间:2011-02-15 00:07:26

标签: c# android hash md5

我同时在android和c#中进行md-5哈希处理。但是对于相同的输入,结果应该是相同的。它在两种语言中的表现方式有什么不同吗?

在这两种情况下我得到不同的输出。这是md-5计算的c#代码:

//this method hashes the values sent to it using MD5
public static String hashwithmd5(String toHashMD5)
{
    byte[] keyArray;

    MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
    keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(toHashMD5));
    hashmd5.Clear();
    return Convert.ToBase64String(keyArray, 0, keyArray.Length); 
}

这里是使用bouncycastle

的android中md5的代码
public byte[] Hashing(String toHash) throws Exception{
    byte[] hashBytes = toHash.getBytes("UTF-8");
    EditText et = (EditText) findViewById(R.id.entry);
    org.bouncycastle.crypto.digests.MD5Digest digest = new org.bouncycastle.crypto.digests.MD5Digest();
    digest.reset();
    digest.update(hashBytes, 0, hashBytes.length);
    int length = digest.getDigestSize();
    byte[] md5 = new byte[length];
    digest.doFinal(md5, 0);
    et.setText(md5.toString());
    return md5;
}

c#中md5的结果是:XUFAKrxLKna5cZ2REBfFkg ==

android中md5的结果是:[B @ 4053cf40

4 个答案:

答案 0 :(得分:8)

C#代码将散列转换为Base64,而java代码则不然。如果将两个原始哈希值转换为例如十六进制字符串,它们将是相同的。

答案 1 :(得分:1)

在Java中使用它时:

byte[] md5 = new byte[length];
// ...
md5.toString()

得到字节值的表示。您将获得对象的通用“字符串表示形式”。这里,[B@4053cf40基本上意味着“字节数组(用于'[B'),内部恰好位于地址4053cf40”。

使用android.util.Base64将您的字节转换为Base64编码的字符串。

答案 2 :(得分:0)

@erik是正确的。 MD5不再被视为“安全”哈希;使用SHA-256。

答案 3 :(得分:0)

Erik绝对正确。 MD5的使用接近灭绝,使用任何强大的SHA