Ruby hmac sha256 哈希对于变量和文字不同

Ruby hmac sha256 hash differs for variable versus literal

在哈希函数中使用变量时,HMAC SHA256 哈希生成的变化与使用文字相比有所不同。

我必须连接 4 个参数以生成使用密钥散列的消息字符串。连接的消息字符串生成的散列与使用消息的值作为文字不同。

require 'base64'
require 'openssl'

securityKey = 'A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc='
content = 'hello'
id = '1000000855'
tsp = '1460852115'
guid = '75c6016eaa1e43b4807ba25232797714'

contentmd5 = Base64.encode64(OpenSSL::Digest::MD5.digest(content))
inputString = id + tsp + guid + contentmd5
puts inputString
#Input String is 
#'1000000855146085211575c6016eaa1e43b4807ba25232797714XUFAKrxLKna5cZ2REBfFkg=='

digest = OpenSSL::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, securityKey, inputString)
securityToken = Base64.encode64(hmac)
puts securityToken
#Hash generated is 7ihOEZNeoJMwjLt84I8WfN5b0VwgYNOg8abPA3nZ0SM=

digest = OpenSSL::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, securityKey, '1000000855146085211575c6016eaa1e43b4807ba25232797714XUFAKrxLKna5cZ2REBfFkg==')
securityToken = Base64.encode64(hmac)
puts securityToken
#Hash generated is gPNytNGMbhg8b27rklqmEK/9xjNAcOq+7nldzyDL4g0=

看起来 Base64.encode64 在其输出的末尾附加了一个“\n”所以

来自 docs

encode64(bin) Returns the Base64-encoded version of bin. This method complies with RFC 2045. Line feeds are added to every 60 encoded characters.

这个

contentmd5 = Base64.encode64(OpenSSL::Digest::MD5.digest(content))

returns

"XUFAKrxLKna5cZ2REBfFkg==\n"

没有

 "XUFAKrxLKna5cZ2REBfFkg=="

--

您可以使用 strict_encode64 不包含换行符,因此:

contentmd5 = Base64.strict_encode64(OpenSSL::Digest::MD5.digest(content))

returns

 => "XUFAKrxLKna5cZ2REBfFkg=="