使用Oracle STANDARD_HASH,在JAVA中重现哈希

Oli*_*ver 3 java oracle hash compatibility

我在 Oracle 中使用 STANDARD_HASH('input','SHA256') 函数用相对哈希值填充记录。

这可以通过连接到 Oracle 来重现:

select STANDARD_HASH('1234','SHA256') 
from dual
Run Code Online (Sandbox Code Playgroud)
select STANDARD_HASH('1234','SHA256') 
from dual
Run Code Online (Sandbox Code Playgroud)

现在问题是什么;为了准确地重现 Oracle 中 STANDARD_HASH 生成的哈希值,我必须在 JAVA 中做什么?有人对此有经验吗?

笔记; 由于某种原因,推荐的 Oracle 哈希函数上没有种子。有谁知道默认种子或如何解决这个问题?

背景:我想做什么?使用 Oracle-Default-Tools 填充 Oracle 中的表,并使用 Java 程序接收输入、对其进行散列并在表中选择正确的记录。

我不想要什么;人们告诉我如何以不同的方式实现它,我正是需要这种方式,否则可以节省你的时间

mar*_*usk 5

您可以使用标准库来做到这一点。使用java.security.MessageDigest和算法SHA-256

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import javax.xml.bind.DatatypeConverter;
...

String input = "1234";        
byte[] hashBytes = MessageDigest.getInstance("SHA-256")
        .digest(input.getBytes(StandardCharsets.UTF_8));
String hash = DatatypeConverter.printHexBinary(hashBytes);
System.out.println(hash);
Run Code Online (Sandbox Code Playgroud)

这将打印03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4,将返回相同的字符串STANDARD_HASH

正如如何在 Java 中将字节数组转换为十六进制字符串中所讨论的那样?,有更快的方法将 a 转换byte[]为十六进制字符串,但DatatypeConverter.printHexBinary()具有成为标准库的一部分的好处,并且应该适合大多数用例。

Java 17 将HexFormat添加到标准库中,它可以让您替换

String hash = DatatypeConverter.printHexBinary(hashBytes);
Run Code Online (Sandbox Code Playgroud)

String hash = HexFormat.of().withUpperCase().formatHex(hashBytes);
Run Code Online (Sandbox Code Playgroud)