使用Oracle STANDARD_HASH,在JAVA

时间:2017-09-12 11:36:24

标签: java oracle hash compatibility

我在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程序接收输入,哈希并在表中选择正确的记录。

我不想要的东西;告诉我如何以不同的方式实现它的人,我需要这样,否则节省你的时间

2 个答案:

答案 0 :(得分:3)

您可以使用标准库执行此操作。使用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将返回的相同字符串。

正如How to convert a byte array to a hex string in Java?中所讨论的,有更快的方式将byte[]转换为十六进制字符串,但DatatypeConverter.printHexBinary()有利于成为标准库的一部分,应该没问题对于大多数用例。

答案 1 :(得分: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;