Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby hmac sha256哈希因变量和文字而异_Ruby_Hash_String Concatenation_Sha256_Hmac - Fatal编程技术网

Ruby hmac sha256哈希因变量和文字而异

Ruby hmac sha256哈希因变量和文字而异,ruby,hash,string-concatenation,sha256,hmac,Ruby,Hash,String Concatenation,Sha256,Hmac,HMAC SHA256哈希在哈希函数中使用变量时生成的更改比使用文本时生成的更改大 我必须连接4个参数来生成一个使用密钥散列的消息字符串。连接的消息字符串生成的哈希与将消息值用作文本不同 require 'base64' require 'openssl' securityKey = 'A93reRTUJHsCuQSHR+L3GxqOJyDmQpCgps102ciuabc=' content = 'hello' id = '1000000855' tsp = '1460852115' guid

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”,因此

encode64(bin)返回Base64编码的 bin的版本。该方法符合RFC 2045的要求。换行是 添加到每60个编码字符

这个

返回

"XUFAKrxLKna5cZ2REBfFkg==\n"
 => "XUFAKrxLKna5cZ2REBfFkg=="
不是

--

您可以使用严格编码64不包括换行符,以便:

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

"XUFAKrxLKna5cZ2REBfFkg==\n"
 => "XUFAKrxLKna5cZ2REBfFkg=="

很不错的。我认为必须使用inspect(
p
)而不是
put
,才能找到这样的差异。这真是太好了。它起作用了。我完全不明白为什么文字可以工作,而变量不能工作,即使显示的字符串相同。这就是原因。多谢。