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

标签 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 并且结果相同

最佳答案

如您所说,如果您正在编码的数据不包含 \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/

相关文章:

cryptography - 可以为bcrypt随机生成盐吗?

java - 使 EditText 字段不可编辑

java - 从字符串JAVA中删除序列字符

html - 使用 HtmlAgilityPack 将 HTML 转换为字符串

vb.net - VBA 错误 1004 - 范围类的选择方法失败

windows - System.IO.File.ReadAllText 的默认编码是什么

ruby-on-rails - 将不同的 HTML5 格式应用于嵌套在数组中的散列中的键值

Java:计算质数

java - 不使用方法的返回值,是不是设计不好?

javascript - 如何在rails中使用JSON数据并将其提供给javascript