我正在将一个值从我的前端(Flex)发送到后端(Oracle),同时还附带了该值的哈希值。
在我的前端,我使用来自Google Code的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?