我在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\r0x0D)的常数,而vbLF\n0x0A)的常数。 Environment.NewLinevbNewLine依赖于平台,但是在Windows中它们等效于vbCR & vbLF

10-06 05:27