2015-05-03 4 views
1

Я следуя этому примеруНевозможно воспроизвести AWS подпись из примера с использованием HMAC SHA256

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

и пытается воспроизвести строку 64 символов для подписи, который они заявляют, как ...

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

Я успешно подобрал шестнадцатеричный digeset для Canonical Request и положил, что строка StringToSign верна.

Последняя часть вычисляет подпись и подпись. Это где я бил дорожный блок, используя предоставленной функцию рубинового «getSignatureKey»

http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-ruby

signing_key = getSignatureKey secret_access_key, current_date, region, aws_service 
signature = OpenSSL::HMAC.digest('sha256', signing_key, string_to_sign) 


def getSignatureKey key, dateStamp, regionName, serviceName 
    kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) 
    kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) 
    kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) 
    kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") 

    kSigning 
end 

токовый выход для «подписи» эта странная последовательность символов.

ٻ. H53 е} WQ

Что мне не хватает, чтобы получить подпись равно ...

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

ответ

1

Возможно, что ваша «странная последовательность символов» на самом деле является правильным выходом.

OpenSSL::HMAC.digest выплевывает значение, представленное в двоичном коде, и вы сравниваете, что значение, представленное в шестнадцатеричном

Проверьте, чтобы увидеть, что происходит, когда вы печатаете из подписи после преобразования его в шестнадцатиричное представление следующим образом:

signature.each_byte.map { |b| "%02x" % b }.join 
+0

Это близко, но есть три экземпляра, где отсутствует нуль. Я помещал X в следующий шестнадцатеричный код, чтобы продемонстрировать. Интересно, почему нули пропали? aeeed9bbccd4d02ee5c0109b86d86835f99533Xda4c265957d157751f6X4d4X4 vs –

+0

Я вижу, что легко фиксируется, обновит мой ответ –

1

Я не могу сказать из вашего сообщения, но это, возможно, точно такие же результаты, отформатированные по-разному.

Ваш код возвращает необработанный результат операции HMAC - это произвольные двоичные данные, поэтому он не собирается печатать как что-либо читаемое. Amazon ожидает, что вы предоставите шестнадцатеричное представление для каждого байта: первая пара байтов «\ xae \ xee» вместо «aeee»

Самый простой способ сделать это - позвонить hexdigest, а не digest. Обратите внимание, что вы должны сделать это только для конечного HMAC (когда вы подписываете строку для подписания с помощью ключа подписи), а не при создании ключа подписи

+0

, который сделал это. Благодарю. Поэтому, изменив .digest на .hexdigest в окончательном вычислении, я смог получить правильную шестую подпись = OpenSSL :: HMAC.hexdigest ('sha256', signed_key, string_to_sign) –

Смежные вопросы