Java SHA256哈希与vb.net

时间:2017-09-28 12:50:06

标签: java vb.net hash

我在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并使用相同的结果

1 个答案:

答案 0 :(得分:3)

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

在VB中,vbCR\r0x0D)的常量,vbLF\n0x0A)的常量。 Environment.NewLinevbNewLine取决于平台,但在Windows中它们相当于vbCR & vbLF