Проблема подписи Ruby HMAC

У меня проблема с HMAC. Я должен подписать форму, прежде чем отправить ее в банк. Они предоставляют только пример на PHP в своей документации.

У меня есть шестнадцатеричный ключ для подписи моих данных (например, FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A).

В примере с PHP они делают это с ключом перед подписанием данных:

 $key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A";
 $message = "param1=a&param2=b";

 $binKey = pack('H*', $key);
 $signature = hash_hmac('sha512', $msg, $binKey);
 echo $signature;

 // => a3efb70368bee502ea57a1a4708cac8912a5172075ea8dec2de2770dfbb4c8fb587f03fdadc0ca4f9e1bb024cfda12866295b259f5fb4df2fe14d960874a68ab

Я не понимаю, почему они упаковывают ключ, и если я должен сделать что-то подобное с моим ключом. Я сделал следующее в своем коде Ruby:

key = "FCEBA61A884A938E7E7FE4F5C68AA7F4A349768EE5957DDFBE99C1D05A09CBACF1FCF0A7084CB2E4CBA95193176C4395DE7F39EA9DBEBEF0907D77192AAE3E8A"
message = "param1=a&param2=b"

digest = OpenSSL::Digest.new('sha512')
signature = OpenSSL::HMAC.hexdigest(digest, key, message)

puts signature

# => d817611845246640d1224a0874bf60fed0956a367aa3069b7947cbec56903bb5d8c54df170f5504c586dad55e4f879c70cf1a40526cfc9f35411195822c535ed

3 ответа

Решение

Вам нужно сделать это в Ruby:

hash = OpenSSL::HMAC.hexdigest(digest, [key].pack('H*'), message)

Настоящая проблема здесь в том, что ваш PHP-код использует два имени переменной для сообщения. Ты устанавливаешь $messageзатем используйте $msg, это означает, что вы вычисляете хеш для неопределенной переменной.

Я использую это в моем проекте:

bin_key = Array(keyTest).pack 'H*'
@hmac = OpenSSL::HMAC.hexdigest("SHA512", bin_key, msg).upcase

Это прекрасно работает для меня.

Упаковка шестнадцатеричного представления ключа обратно в двоичную форму - это бит, который вам не хватает.

Смотрите этот пост, например: https://blog.bigbinary.com/2011/07/20/ruby-pack-unpack.html

Вы хотите что-то вроде этого:

signature = OpenSSL::HMAC.hexdigest(digest, key.pack('H'), message)
Другие вопросы по тегам