获取Java和C#之间的匹配校验和

时间:2019-03-21 15:00:58

标签: java c# checksum sha256

我要从C#应用程序移植一个为文件(base64编码)创建校验和的方法,将其从C#应用程序移植到Java。在C#中,这是方法:

public static string GetChecksum(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
      var sha = new SHA256Managed();
      byte[] checksum = sha.ComputeHash(stream);
      return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

到目前为止,这是我在Java中所拥有的,但它绝对与C#返回的值不匹配:

private static String getCheckSum(String base64Data) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(base64Data.getBytes("UTF-8"));
        byte[] enc = md.digest();

        StringBuilder sb = new StringBuilder();
        for (byte b : enc) {
            sb.append(String.format("%02x", b));
        }

        return sb.toString().replace("-", "").toUpperCase();
    }

我尝试在getBytes()方法中不使用字符集,而我尝试使用字符集US-ASCII

这些东西不在我的驾驶室中,我不确定如何继续。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

在Java中,可以使用Base8 String解码Base64 String:

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

来自:https://www.baeldung.com/java-base64-encode-and-decode

答案 1 :(得分:0)

您可以使用Guava库来计算哈希。

String sha256hex = Hashing.sha256()
  .hashString(originalString, StandardCharsets.UTF_8)
  .toString();

Apache Commons编解码器还具有用于计算哈希的库。

String sha256hex = DigestUtils.sha256Hex(originalString);