gpt4 book ai didi

Java SHA256 哈希与 vb.net 中的不同

转载 作者:行者123 更新时间:2023-11-29 04:25:41 24 4
gpt4 key购买 nike

我在 vb.net 中计算哈希时遇到问题。

Java 中计算良好散列的工作代码是

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class MyClass {
public static void main(String args[]) {
String test = "line1\nline2";
System.out.println(test);
String testOut = getTest(test);
System.out.println(testOut);
}

public static String getTest(String input) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(input.getBytes());
return Base64.getEncoder().encodeToString(md.digest());
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}

这段代码的输出是

line1
line2
aDN24pCCm0gsJlV0XK/6eh3M+hCvqmLawrQt1saND4M=

下面是 vb.net 中不工作的例子

Dim test As String = "line1\nline2"
Console.WriteLine(test)
Dim mySHA256 As SHA256 = SHA256Managed.Create()
mySHA256.ComputeHash(Encoding.UTF8.GetBytes(test))
Dim out = Convert.ToBase64String(mySHA256.Hash)
Console.WriteLine(out)

输出如下

line1\nline2
RrUKDuWDeHhbuSYAZlamp7dr3ujXi3v9cm8xvOUtdM0=

所以我发现“\n”在vb.net 中不是字符换行。所以我使用了vbNewLine

Dim test2 As String = "line1" + vbNewLine + "line2"
Console.WriteLine(test2)
Dim mySHA256_2 As SHA256 = SHA256Managed.Create()
mySHA256_2.ComputeHash(Encoding.UTF8.GetBytes(test2))
Dim out2 = Convert.ToBase64String(mySHA256_2.Hash)
Console.WriteLine(out2)

输出如下

line1
line2
0UqRptHG7oO/DHdOvsvubYs5OzldrinuqDnDVNb7qcA=

我尝试使用 TransformFinalBlock 而不是 ComputeHash

Dim test3 As String = "line1" + vbNewLine + "line2"
Console.WriteLine(test3)
Dim mySHA256_3 As SHA256 = SHA256Managed.Create()
mySHA256_3.TransformFinalBlock(Encoding.UTF8.GetBytes(test3), 0, Encoding.UTF8.GetBytes(test3).Length)
Dim out3 = Convert.ToBase64String(mySHA256_3.Hash)
Console.WriteLine(out3)

并且输出与之前相同

line1
line2
0UqRptHG7oO/DHdOvsvubYs5OzldrinuqDnDVNb7qcA=

我怀疑是 Java 的换行符 "\n" 导致了问题,因为它计算出了错误的哈希值。如果我有没有 "\n" 的字符串,那么值是相同的。在 vb.net 中,我尝试使用 Environment.NewLine 而不是 vbNewLine 并且结果相同

最佳答案

如您所说,如果您正在编码的数据不包含 \n,那么它可以正常工作。所以你的问题显然与哈希算法无关。你的问题是你没有将字符串文字中的 \n 正确地翻译成 VB,所以两个输入字符串是不同的。如果您输出字节,您会看到 Java 的有 0x0A(十进制的 10)而 VB 的有 0x0D 0x0A(十进制的 13、10)用于新的线。

在VB中,vbCR\r(0x0D)的常量,vbLF\r的常量\n(0x0A)。 Environment.NewLinevbNewLine 依赖于平台,但在 Windows 中它们等同于 vbCR & vbLF

关于Java SHA256 哈希与 vb.net 中的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46469612/

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