【问题标题】:Hashed string in C# is not readable [duplicate]C# 中的散列字符串不可读[重复]
【发布时间】:2023-03-22 18:16:01
【问题描述】:

我正在尝试在 C# 和 Java 中散列相同的字符串。

C#哈希方法:

  public static string hashValue (string value)
    {
        byte[] input = null;

        HashAlgorithm digest = HashAlgorithm.Create("SHA-512");
        input = digest.ComputeHash(Encoding.UTF8.GetBytes(value));

        return System.Text.UTF8Encoding.UTF8.GetString(input);
    }

WPF 文本框中的输出如下所示:"՘"�?N[��"��2��D��j��t!z}7�H�p “J����GƼOp�EnBfH��X���”。

Java 中的相同函数返回结果:“[B@41e2db20”。

Java 哈希方法是这样的:

    public static String hashValue(String value) {

    byte[] input = null;

    MessageDigest digest;
    try {
        digest = MessageDigest.getInstance("SHA-512");
        try {
            input = digest.digest(value.getBytes("UTF-8")); 

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } catch (NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    }

    return input.toString();
}

你能告诉我我做错了什么吗?为什么结果在 C# 中看起来那么奇怪?

【问题讨论】:

  • 对我来说,Java 版本看起来不对。 SHA-512 应该返回 512 位 => 64 字节 => [B@41e2db20 很短(请参阅 en.wikipedia.org/wiki/SHA-2#Examples_of_SHA-2_variants
  • 您不应将哈希显示为 UTF8。它只是一个字节数组而不是字符串。有关示例,请参见 stackoverflow.com/a/5340599/706456
  • 不要把哈希值当作字符串——如果你想显示它,用十六进制编码
  • 我现在明白问题所在了。非常感谢你让我大开眼界:)

标签: java c# hash hashcode


【解决方案1】:

您的 C# 结果看起来很“奇怪”,因为您已将散列的随机字节转换为 UTF-8 字符串。这不会产生任何漂亮的东西,因为许多字节值将映射到不可打印的字符。

您可能希望将哈希转换为十六进制。为此,请使用 DatatypeConverter 类:

return DatatypeConverter.printHexBinary(input);

我不确定 C# 等价物 - 但请查看 Google。


作为记录,您当前 C# 代码的 Java 等效项是:

return new String(input, "UTF-8");

当前您正在调用.toString(),这对于Java 字节数组会导致调用Object.toString() 方法。这会打印对象的类型和哈希码,但不会打印内容。

【讨论】:

  • 这不仅是很多字符不可打印的问题,而且任意字节数组可能包含无效的 UTF-8 序列。在 Java 中,此类序列被转换为 Unicode 字符 U+FFFD(替换字符)。首先,这将截断散列并破坏其目的,并且您不能确定无效的 UTF-8 序列在其他语言中的处理方式相同。
  • @jarnbjo 感谢您提供更多信息。这解释了输出中出现的问号:fileformat.info/info/unicode/char/0fffd/index.htm
猜你喜欢
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多