【发布时间】:2012-03-28 11:52:29
【问题描述】:
我正在尝试在 android 中生成 SHA256 哈希,然后将其传递给 ASP.NET Web API Web 服务并在那里比较哈希。因此,我需要在 Android 中构造一个哈希,在 ASP.NET 中给定相同的输入将生成一个等效的哈希。我正在努力找出自己做错了什么。
这是 Android 代码:
public String computeHash(String input) throws NoSuchAlgorithmException{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
try{
digest.update(input.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e){
e.printStackTrace();
}
byte[] byteData = digest.digest(input.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++){
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
这是服务器上的代码 (c#):
private static string ComputeHash(string input, HashAlgorithm algorithm)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashedBytes.Length; i++)
{
sb.Append(String.Format("{0:x2}", hashedBytes[i]));
}
return sb.ToString();
}
更新: 这是更正后的 Android/Java 实现(感谢 Nikolay Elenkov):
public String computeHash(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
byte[] byteData = digest.digest(input.getBytes("UTF-8"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++){
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
【问题讨论】:
-
我不敢相信你们今天为我节省了多少时间。感谢您发布更新。
-
如何将哈希字符串转换回java中的原始输入。任何想法谢谢
-
加密哈希是单向的...请参阅以下文章:en.wikipedia.org/wiki/Cryptographic_hash_function
标签: android asp.net security sha asp.net-web-api