我从前端(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?
答案 0 :(得分: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 :(得分:0)
终于解决了。在Oracle Application Server和存储数据的数据库上,nls lang设置不同。
感谢Codo带领我朝着正确的方向前进。