我正在從前端(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感謝您的提示!我會檢查我們的DBA並回來。 – Zesty 2010-08-19 18:50:12
它似乎沒有工作。我收到消息「PL/SQL:數字或值錯誤」。我使用了雙重選擇utl_raw.convert(utl_raw.cast_to_raw('myData'),'AL32UTF8','UTF8') ; – Zesty 2010-08-23 09:55:26