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 程序接收输入、对其进行散列并在表中选择正确的记录。
我不想要什么;人们告诉我如何以不同的方式实现它,我正是需要这种方式,否则可以节省你的时间
您可以使用标准库来做到这一点。使用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)
| 归档时间: |
|
| 查看次数: |
5678 次 |
| 最近记录: |