【问题标题】:Compute SHA256 Hash in Android/Java and C#在 Android/Java 和 C# 中计算 SHA256 哈希
【发布时间】: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


【解决方案1】:

我正在为我的 Android 应用寻找 Kotlin 版本。

我找不到;这是我想出的:

fun String.getSha256(): String {
    val digest = MessageDigest.getInstance("SHA-256").apply { reset() }
    val byteData: ByteArray = digest.digest(this.toByteArray())
    return StringBuffer().apply {
        byteData.forEach {
            append(((it.toInt() and 0xff) + 0x100).toString(16).substring(1))
        }
    }.toString()
}

【讨论】:

    【解决方案2】:

    您的 Java 代码有误:您将输入字节添加了两次。如果您要一次性计算,则需要仅调用digest(bytes) 或在update(bytes) 之后调用digest()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 2016-08-03
      • 1970-01-01
      • 2011-10-14
      • 2021-11-25
      • 1970-01-01
      • 2016-04-11
      • 2016-07-27
      相关资源
      最近更新 更多