2010-08-19 1005 views
3

我正在從前端(Flex)向後端(Oracle)發送一個值以及該值的哈希值。哈希值不匹配(可能與編碼有關?)

從我的前端,我使用的as3corelib庫從谷歌代碼使用SHA1算法來計算HMAC哈希值:

com.adobe.crypto.HMAC.hash(mySecret, myMessage, com.adobe.crypto.SHA1); 

在後端,我使用的是Oracle的DBMS_CRYPTO包:

dbms_crypto.mac(utl_raw.cast_to_raw(myMessage), dbms_crypto.hmac_sh1, 
utl_raw.cast_to_raw(mySecret)); 

這兩個值通常匹配。但是我遇到了一個他們沒有的例子。我檢查了什麼是不同的,發現前端以某種方式在信息的末尾添加了時髦的字符(它在後端數據中無法看到)。

我猜測它是某種編碼相關的。這裏是adobe函數的來源:

 public static function hash(secret:String, 
message:String, algorithm:Object = null):String 
     { 
      var text:ByteArray = new ByteArray(); 
      var k_secret:ByteArray = new ByteArray(); 

      text.writeUTFBytes(message); 
      k_secret.writeUTFBytes(secret); 

      return hashBytes(k_secret, text, algorithm); 
     } 

我不知道如何檢查Oracle的散列,因爲身體被加密。

因此,任何想法爲什麼我的哈希值不匹配這個字符? (我知道數據甚至不應該有額外的字符,這可能是一個換行符或別的東西,但無論我收到的數據,我的散列必須工作或它是不可靠的)。我懷疑它與編碼有關,但我不知道我可以做什麼不同。

請幫助,朋友。

編輯:我的數據庫使用AL32UTF8。我不確定Flex前端使用什麼編碼。 Flex前端的包中的哈希函數看起來像它期望的UTF編碼文本,但這是否意味着它實際上是UTF?它依賴於將數據提供給前端的oracle httpservice嗎?

回答

1

可能是你的字符串編碼有問題。在前端中,您明確地將字符串轉換爲UTF-8字節表示形式。在後端,它取決於不同的會話和數據庫設置,這不能從你的問題中派生出來。

所以可能的解決方案是:

dbms_crypto.mac(
    utl_raw.convert(utl_raw.cast_to_raw(myMessage), 'WE8ISO8859P1', 'UTF8'), 
    dbms_crypto.hmac_sh1, 
    utl_raw.cast_to_raw(mySecret) 
); 

相反的WE8ISO8859P1,使用您的任何關於字符集數據庫或會話設置。

+0

+1感謝您的提示!我會檢查我們的DBA並回來。 – Zesty 2010-08-19 18:50:12

+0

它似乎沒有工作。我收到消息「PL/SQL:數字或值錯誤」。我使用了雙重選擇utl_raw.convert(utl_raw.cast_to_raw('myData'),'AL32UTF8','UTF8') ; – Zesty 2010-08-23 09:55:26

0

終於解決了。 nls lang設置在Oracle應用服務器和存儲數據的數據庫上不同。

感謝科多帶領我朝着正確的方向前進。