比较 android(java) 和 c# 中的 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);
}
这是 android 中使用 bouncycastle 的 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
I am doing md-5 hashing in both android and c# at the same time. But both the results should be the same for the same inputs. Is there any difference in the way its done in both the languages?
I get different outputs in both the cases. Here is the c# code for md-5 calculation:
//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);
}
and here is the code for md5 in android using bouncycastle
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;
}
the result of md5 in c# is :XUFAKrxLKna5cZ2REBfFkg==
the result of md5 in android is :[B@4053cf40
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
C# 代码将哈希值转换为 Base64,而 java 代码则不会。如果您将两个原始哈希值转换为十六进制字符串,它们将是相同的。
The C# code converts the hash to Base64, the java code does not. If you convert both raw hashes to e.g. hex strings, they'll be the same.
当您在 Java 中使用它时:
您没有获得字节值的表示。您将获得对象的通用“字符串表示形式”。这里,
[B@4053cf40
基本上意味着“字节数组(用于‘[B’),其内部恰好位于地址 4053cf40”。使用
android.util.Base64
将字节转换为 Base64 编码的字符串。When you use this in Java:
you are not getting a representation of the byte values. You get the generic "string representation" of an object. Here,
[B@4053cf40
basically means "array of bytes (that's for the '[B') which internally happens to be at address 4053cf40".Use
android.util.Base64
to convert your bytes to a Base64 encoded string.@erik是正确的。 MD5 不再被视为“安全”哈希;使用 SHA-256。
@erik is correct. MD5 is no longer considered a "secure" hash; use SHA-256.
埃里克是绝对正确的。 MD5 的使用已接近绝迹,请使用任何强 SHA
Erik is absolutely right. MD5 usage is near extinction, use any strong SHA