2017-09-12 42 views
3

我在Oracle中使用STANDARD_HASH('input','SHA256')函數來使用它們的相對哈希值填充記錄。使用Oracle STANDARD_HASH,在JAVA中重現哈希

這可以通過連接到Oracle做被複制:

select STANDARD_HASH('1234','SHA256') 
from dual 
Table X  
Column 1, Column 1-hashed  
1234, sha512hashresult  
1234, sha512hashresult  
1234, sha512hashresult  
1234, sha512hashresult  

現在什麼的問題;爲了準確再現Oracle中由STANDARD_HASH生成的哈希值,我必須在JAVA中做些什麼?有人對此有經驗嗎?

注意;出於某種原因,推薦的Oracle散列函數中沒有種子。有沒有人知道默認種子或如何解決這個問題?

背景:我想做什麼?使用Oracle-Default-Tools在Oracle中填充表格,並使用Java程序接收輸入,對其進行散列並在表格中選擇正確的記錄。

我不想要的東西;那些告訴我如何以不同方式實現它的人,我需要這種方式,否則會節省您的時間

+0

而不是嘗試在Java中重現該功能,爲什麼不使用服務讓我們說從Java調用它(並讓它在數據庫端執行)。 – g00dy

回答

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()具有作爲標準庫的一部分利益,而應該是適合大多數使用情況。

+0

非常感謝您的支持 –

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;