Я отправляю значение из моего внешнего интерфейса (Flex) во внутренний сервер (Oracle) вместе с хешем значения.
В своем интерфейсе я использую библиотеку as3corelib из Google Code для вычисления значения хеш-функции HMAC с использованием алгоритма SHA1:
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? Зависит ли это от оракула httpservice, который обслуживает данные для внешнего интерфейса?