我在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程序接收输入,哈希并在表中选择正确的记录。
我不想要的东西;告诉我如何以不同的方式实现它的人,我需要这样,否则节省你的时间
答案 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;