我在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=
因此我发现vb.net中的字符\ n不是换行符。所以我用
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
是\n
(0x0A
)的常数。 Environment.NewLine
和vbNewLine
依赖于平台,但是在Windows中它们等效于vbCR & vbLF
。