#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
этого нет. Возможно, вам придется добавить к подписи ‘=’ в конце.