Я пытаюсь переписать следующий код Баш в Ruby:Баш код HMACSHA1 Руби
export PRIVATE_KEY="my-private-key"
echo -n $(iconv -c -f UTF-8 -t US-ASCII <<EOF
{
"tenantId": "$TENANT",
"username": "$USERNAME",
"password": "$PASSWORD",
"rememberMe" : 1,
"timestamp": "${TIMESTAMP}"
}
EOF
) >${BODY}
export SIGN_HASH=$(cat ${BODY} | openssl dgst -sha1 -hmac ${PRIVATE_KEY} -binary | openssl enc -base64)
До сих пор это то, что я пришел с:
TIMESTAMP = Time.now.to_f
body = { tenantId: "tenant", username: "nnuser", password: "password", rememberMe: "1", timestamp: TIMESTAMP }
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), PRIVATE_KEY.encode("ASCII"), body.to_s.encode("ASCII"))
sign_hash = Base64.encode64(hmac)
Но результат строк разные, а одно из Ruby не работает. Кроме того, код bash возвращает 28 символов SIGN_HASH
, а в коде Ruby sign_hash
- 64 символа.
Вместо преобразования хэш строки, я d настоятельно рекомендуем использовать JSON для сериализации информации. Строковая версия отправит символы/ключи в виде строковой версии символа, которые другие языки не поймут, и вам придется декодировать или махать. JSON преобразует их в свою строчную форму перед сериализацией, что позволит очень легко переваривать/повторно использовать данные на любом языке, поддерживающем JSON. Даже если вы только отправляете на другие процессы Ruby, использование JSON облегчит вам процесс декодирования информации. –