2015-12-14 6 views
0

Я пытаюсь переписать следующий код Баш в 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 символа.

+1

Вместо преобразования хэш строки, я d настоятельно рекомендуем использовать JSON для сериализации информации. Строковая версия отправит символы/ключи в виде строковой версии символа, которые другие языки не поймут, и вам придется декодировать или махать. JSON преобразует их в свою строчную форму перед сериализацией, что позволит очень легко переваривать/повторно использовать данные на любом языке, поддерживающем JSON. Даже если вы только отправляете на другие процессы Ruby, использование JSON облегчит вам процесс декодирования информации. –

ответ

1

Есть по крайней мере 2 вещи неправильно с вашим кодом:

Исходная строка различна: вызов to_s на ваш хэш не будет производить выходной отформатирован как ваш Баш скрипт (попробуйте в консоли).

Вы используете hexdigest, который выводит хэш как 40 шестнадцатеричных символы, а затем 20 байт двоичного выхода, который вы хотите (который производится методом digest)

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