bash的HMACSHA1代码到Ruby
问题描述:
我试图重新写了下面的bash代码在Ruby中:bash的HMACSHA1代码到Ruby
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个字符。
答
至少有两件事情你的代码错误:
初始的字符串是不同的:在你的哈希不会产生输出格式喜欢你的bash脚本(尝试在控制台)调用to_s
。
您使用hexdigest
其输出所需的散列作为40个16进制字符,而然后将20字节的二进制输出(它是由digest
方法制造)
代替散列转换成字符串的,我d强烈建议使用JSON序列化信息。字符串版本会将符号/键作为符号的字符串化版本发送,其他语言不会理解,您将不得不解码。 JSON会在序列化之前将它们转换为字符串形式,这将使得以任何支持JSON的语言消化/重用数据变得非常容易。即使只发送给另一个Ruby进程,在解码信息时使用JSON也会使其更容易。 –