哈希值不匹配(可能与编码有关)?

3

我正在将一个值从我的前端(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?

2个回答

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,而是使用与您的数据库或会话设置相关的字符集。


+1 谢谢你的提示!我会与我们的数据库管理员核实并回复。 - Zesty
它似乎不起作用。我收到了“PL/SQL:数字或值错误”的消息。我使用了select utl_raw.convert(utl_raw.cast_to_raw('myData'), 'AL32UTF8', 'UTF8') from dual; - Zesty

0

问题终于解决了。Oracle应用服务器和存储数据的数据库的nls lang设置不同。

感谢Codo指引我找到正确的方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接