我在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
并使用相同的结果
答案 0 :(得分:3)
正如您所说,如果您编码的数据不包含\n
,那么它可以正常工作。所以你的问题显然与散列算法无关。你的问题是你没有正确地将你的字符串文字中的\n
翻译成VB,所以两个输入字符串是不同的。如果输出字节,您将看到Java的字节为0x0A
(十进制为10),VB为新行的0x0D 0x0A
(十进制为13,10)。
在VB中,vbCR
是\r
(0x0D
)的常量,vbLF
是\n
(0x0A
)的常量。 Environment.NewLine
和vbNewLine
取决于平台,但在Windows中它们相当于vbCR & vbLF
。