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

Using Oracle STANDARD_HASH, reproduce the hash in JAVA

我在 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 中做什么才能准确地重现由 STANDARD_HASH 在甲骨文?有人对此有经验吗?

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

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

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

如果您可以在 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;

您可以使用标准库来做到这一点。将 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);

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

How to convert a byte array to a hex string in Java? 中所讨论的,有更快的方法将 byte[] 转换为十六进制字符串,但 DatatypeConverter.printHexBinary() 具有作为标准库的一部分的优势,并且应该适用于大多数用例。