2015-12-14 34 views
0

我试图重新写了下面的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个字符。

+1

代替散列转换成字符串的,我d强烈建议使用JSON序列化信息。字符串版本会将符号/键作为符号的字符串化版本发送,其他语言不会理解,您将不得不解码。 JSON会在序列化之前将它们转换为字符串形式,这将使得以任何支持JSON的语言消化/重用数据变得非常容易。即使只发送给另一个Ruby进程,在解码信息时使用JSON也会使其更容易。 –

回答

1

至少有两件事情你的代码错误:

初始的字符串是不同的:在你的哈希不会产生输出格式喜欢你的bash脚本(尝试在控制台)调用to_s

您使用hexdigest其输出所需的散列作为40个16进制字符,而然后将20字节的二进制输出(它是由digest方法制造)