java - Java 和 C# 中使用 SHA-1 加密 ID 时,C# 有时会返回前面多一个 0 的值

标签 java c# encryption sha1

我有一个网站连接到另一个外部网站并传递 ID 号,我正在处理并生成链接的页面是用 C# 编写的,而目标网站是用 Java 编写的,我遇到了一些不匹配的情况

我尝试在 C# 中使用与 Java 中的代码相同的方法来加密 ID,代码如下所示:

public static String shaHash(String input) 
throws NoSuchAlgorithmException {
  if (input == null) {
    return null;
  }
  MessageDigest sha = MessageDigest.getInstance("SHA");
  try {
    sha.update(input.getBytes("UTF8"));
    BigInteger hash = new BigInteger(1, sha.digest());
    return hash.toString(16);
  } catch (UnsupportedEncodingException e) {}
  return null;
}

C# 代码看起来像

StringBuilder convertedId = new StringBuilder();
            var idToByte = Encoding.ASCII.GetBytes(id);
            using (SHA1 sha1 = SHA1.Create())
            {
                var bytes = sha1.ComputeHash(idToByte);
                for (int i = 0; i < bytes.Length; i++)
                {
                    convertedId.Append(bytes[i].ToString("x2"));
                }
            }
            return convertedId.ToString();

但返回值有所不同,因为 C# 代码似乎在开头添加了额外的 0:

Java:b83caf2f739209c42a8d02df0f6d4794f288703,和 C#:0b83caf2f739209c42a8d02df0f6d4794f288703

这会是什么问题呢?我尝试将 C# 代码中的编码更改为 UTF8,但仍然不起作用。

大家有什么想法吗?

提前非常感谢

最佳答案

问题是,你要不要额外的0?

十六进制输出通常以每个字节 2 个十六进制数字的形式完成,因此您会得到偶数个数字,即前导 0 通常就是您想要的。

Java 的 BigInteger 不会这样做,因为对于它来说,输出是一个以 16 为基数的数字,而不是字节的十六进制编码 em>.

因此,您应该在 Java 中添加前导 0,而不是在 C# 中删除多余的 0。

您可以继续使用 BigInteger,但如果结果字符串的长度为奇数(例如 s.length() % 2 != 0),或使用其他一些方法对 byte[] 进行十六进制编码。
参见例如How to convert a byte array to a hex string in Java?

关于java - Java 和 C# 中使用 SHA-1 加密 ID 时,C# 有时会返回前面多一个 0 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56153835/

相关文章:

java - 展开 JFrame 后如何固定 JPanel 的位置

c# - WPF:从列表<Geometry>中绘制几何图形

c# - 如何在 dotnet core 2.1 中使用 256 长 block 大小的 Rijndael 算法

encryption - Compact Framework - 获取存储卡序列号

python - 使用 M2Crypto 加密文件

java - 如何从 ArrayList<HashMap<String, String>> android 中获取所有元素

当前目录中有多个 jar 文件的 javac 类路径选项导致错误

java - 在 Java 7 中加载 KeyStore 会泄漏类加载器

c# - 具有多个端点的 WCF 双工服务

c# - ComboBox header 不遵守 ItemTemplate