使用Oracle STANDARD_HASH,在JAVA中重新生成哈希值

3

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

可以通过连接到Oracle进行复制:

select STANDARD_HASH('1234','SHA256') 
from dual

Table X    
Column 1, Column 1-hashed    
1234, sha512hashresult    
1234, sha512hashresult    
1234, sha512hashresult    
1234, sha512hashresult    

现在的问题:我需要在JAVA中做些什么才能精确地复制由Oracle的STANDARD_HASH产生的哈希值?有人有这方面的经验吗?

注意:由于某种原因,建议的Oracle哈希函数上没有种子。有人知道默认种子或如何找到它吗?

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

我不想要的是:那些告诉我如何用不同方式实现此操作的人,请按照我需要的方式操作,否则就别浪费时间了。


不要试图在Java中重新编写该函数,为什么不使用服务从Java中调用它(并让它在数据库端执行)呢? - g00dy
2个回答

5

您可以使用标准库来完成此操作。使用算法为SHA-256java.security.MessageDigest

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);

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

正如在如何在Java中将字节数组转换为十六进制字符串?中讨论的那样,有更快的方法将byte[]转换为十六进制字符串,但是DatatypeConverter.printHexBinary()具有成为标准库一部分的优点,并且对于大多数用例来说应该是可以的。

Java 17将HexFormat添加到标准库中,它允许您替换

String hash = DatatypeConverter.printHexBinary(hashBytes);

使用

String hash = HexFormat.of().withUpperCase().formatHex(hashBytes);

非常感谢您的支持。 - Oliver

1
如果你在Java端使用Guava没有问题,那么以下代码应该可以产生与Oracle的STANDARD_HASH相同的结果:
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
...

String input = "1234";        
String hash = Hashing.sha256()
       .hashString(input, Charsets.UTF_8)
       .toString()
       // toString() returns the HEX value as lower-case, whereas
       // Oracle's STANDARD_HASH returns an upper-cased string
       .toUpperCase(); 

System.out.println(hash);

这将打印出 03AC674216F3E15C761EE1A5E255F067953623C8B388B4459E13F978D7C846F4,与Oracle中获得的相同。
select STANDARD_HASH('1234','SHA256') from dual;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接