gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:44:09 24 4
gpt4 key购买 nike

我有一个网站连接到另一个外部网站并传递 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com