Значения хеша не совпадают (возможно, связанные с кодировкой?) - PullRequest
3 голосов
/ 19 августа 2010

Я отправляю значение из моего внешнего интерфейса (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, который обслуживает данные для внешнего интерфейса?

Ответы [ 2 ]

1 голос
/ 19 августа 2010

Возможно, у вас проблема с кодировкой строки. Во внешнем интерфейсе вы явно конвертируете строки в байтовое представление 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 используйте настройки базы данных или сеанса, относящиеся к набору символов.

0 голосов
/ 23 августа 2010

Наконец решено. Параметр nls lang отличался на сервере приложений Oracle и в базе данных, в которой хранятся данные.

Спасибо Codo за то, что он направил меня в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...