使用 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()
具有作为标准库的一部分的优势,并且应该适用于大多数用例。
我在 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()
具有作为标准库的一部分的优势,并且应该适用于大多数用例。