2011-07-08 17 views
2

我有下一個麻煩。 在數據庫日期從日期存儲爲md5。當我在JAVA中使用同一日期的md5時,我有另一個散列。 例如:日期 - 1980年1月2日的java 哈希addaf0f9a1fb3699871293f888f6e46e(與從字符串預言MD5散列) oracle的散列是DF0919EA828A77DC2CCF68474ED703AC如何在JAVA中從日期獲得md5總和,例如在oracle中?

我試圖重複oracle的結果在Java:

System.out.println(streamConvertor.getHash("01.02.1980", Boolean.TRUE)); 
System.out.println(""); 
System.out.println(streamConvertor.getHash("01.02.1980", Boolean.FALSE)); 

public String getMD5(String input, Boolean is_date) throws ParseException { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] mdinput; 
     Boolean pr; 
     if (input.equals("01.02.1980")) { 
      pr = true; 
     } else { 
      pr = false; 
     } 

     if (is_date == Boolean.TRUE) { 
      SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy"); 
      Date day = df.parse(input); 
      mdinput = df.format(day).getBytes(); 
     } else { 
      mdinput = input.getBytes(); 
     } 
     if (pr == Boolean.TRUE) { 
      System.out.println("Is date " + is_date + " - " + mdinput); 
     } 
     byte[] messageDigest = md.digest(mdinput); 
     if (pr == Boolean.TRUE) { 
      System.out.println("message - " + messageDigest); 
     } 
     BigInteger number = new BigInteger(1, messageDigest); 
     if (pr == Boolean.TRUE) { 
      System.out.println("Number - " + number); 
     } 
     String hashtext = number.toString(16); 
     // Now we need to zero pad it if you actually want the full 32 chars. 
     while (hashtext.length() < 32) { 
      hashtext = "0" + hashtext; 
     } 
     if (pr == Boolean.TRUE) { 
      System.out.println("hashtext - " + hashtext); 
     } 
     return hashtext; 
    } 
    catch (NoSuchAlgorithmException e) { 
     throw new RuntimeException(e); 
    } 
} 

和輸出是不同的,但直到字節[]轉換爲BigInteger的:

Is date true - [[email protected] 
message - [[email protected] 
Number - 231093251542199165689934828427325924462 
hashtext - addaf0f9a1fb3699871293f888f6e46e 

Is date false - [[email protected] 
message - [[email protected] 
Number - 231093251542199165689934828427325924462 
hashtext - addaf0f9a1fb3699871293f888f6e46e 

是否有任何可能使MD5哈希如在Oracle?

+3

你在Oracle中做什麼以獲得你的日期的MD5哈希值? –

+0

存儲在bd中的日期被如此散列化 select DBMS_CRYPTO.hash(UTL_RAW.CAST_TO_RAW(UPPER(to_date('01.02.0480','dd.mm.yyyy'))),2)from dual; – Leonid

+0

首頁,你是對的我認爲 – Leonid

回答

2

在你上面的評論,你說在Oracle中使用的準確表述是:

DBMS_CRYPTO.hash(UTL_RAW.CAST_TO_RAW(UPPER(to_date('01.02.1980', 'dd.mm.yyyy'))),2) 

所以你拿串01 .02.1980' ,並使用合適的格式將其轉換爲DATE。然後你將結果傳遞給UPPER();這會使DATE隱式轉換爲字符串,並使用會話的默認日期格式。所以如果它在不同的環境中執行,這個表達式的結果可能會有所不同。

要嘗試在Java中重現相同的散列值,請使用您的NLS_DATE_FORMAT實例參數指示的日期格式。但有可能適用於某些條目,但不適用於其他條目,因爲所用的日期格式可能有所不同。

基本上,您在創建和存儲這些散列值的Oracle代碼中存在非常糟糕的錯誤。將日期隱式轉換爲字符串可能很危險。

+0

感謝您的回答。 我會盡力在星期一檢查它。 – Leonid

+0

非常感謝。 Oracle格式是01.02.1980 00:00:00 我們會在散列之前將oracle和java部分中的日期轉換爲一種格式,以便將來排除此類問題 – Leonid

相關問題