Вычисление подписи HMAC-SHA

#amazon-simpledb #krl #hmac

#amazon-simpledb #krl #hmac

Вопрос:

Я пишу модуль для Amazon SimpleDB. Они требуют, чтобы запросы REST подписывались с использованием алгоритма HMAC-SHA. (Подробности здесь.)

Мне сказали, что есть функция для вычисления этой подписи, но я не могу найти ее в документации. Что это за вызываемая функция и как выглядят ее аргументы?

Комментарии:

1.Смотрите ktest.heroku.com/a421x67 gist.github.com/980000

Ответ №1:

ОТРЕДАКТИРОВАНО: должно работать следующее:

 pre {
  message = "Four score and seven years ago";
  key = "Abe Lincoln";
  signature = math:hmac_sha256_base64(message, key);
}
notify("Signature is", signature);
  

Функция является math:hmac_sha256_base64(<datastring>,<keystring>)

Комментарии:

1. Спасибо, Рэндалл. У меня все еще возникают проблемы с тем, чтобы заставить его работать с AWS, но это правильный синтаксис.

Ответ №2:

HMAC — это стандартная функция, которую можно найти в криптографических библиотеках для большинства платформ. Amazon показывает несколько примеров на странице документации, на которую вы ссылаетесь.

Для Java вы можете найти ее в javax.crypto.Mac

Для .Net загляните в System.Безопасность.Криптография

Для KRL я не нашел никакого встроенного стандартного решения. Поскольку кажется возможным встроить javascript, может оказаться полезной реализация jsSHA. В математической библиотеке есть функция sha1, и реализация HMAC в соответствии с RFC2104 не кажется такой уж сложной.

Комментарии:

1. Спасибо. Я ищу информацию об этой функции в KRL (отсюда и тег KRL).

2. О, никогда об этом не слышал. Выглядит интересно, я осмотрюсь и обновлю свой ответ, если что-нибудь найду.

Ответ №3:

Чтобы подписывать строки встроенными символами новой строки (AWS I’m talking to you!), вы должны выполнить следующее (на основе примера AWS S3)

 pre {
  raw_string = uri:unescape("GET


Wed, 28 Mar 2007 01:29:59  0000
/");
  sample_key = "uV3F3YluFJax1cknvbcGwgjvx4QpvB leU8dUj2o";
  signature = math:hmac_sha1_base64(raw_string, sample_key);
  expected = "Db gepJSUbZKwpx1FR0DLtEYoZA=";
  passfail = (signature eq expected) => "pass" | "fail";
}
  

uri:decode() Функция возвращает строку с соответствующими символами новой строки, где nnn этого нет. Возможно, вам придется добавить к подписи ‘=’ в конце.