2016-04-18 1 views
1

Хеш HMAC SHA256 генерирует изменения, когда переменная используется в функции хеширования, чем с использованием литерала.хеш Ruby 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= 

ответ

2

выглядит Base64.encode64 присоединяет "\ п" до конца своей продукции, так

от docs

encode64 (вместилища) Возвращает в кодировке Base64 версии бункера , Этот метод соответствует RFC 2045. Линейные каналы: , добавленные к каждому 60 закодированным символам.

это

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

возвращает

"XUFAKrxLKna5cZ2REBfFkg==\n" 

не

"XUFAKrxLKna5cZ2REBfFkg==" 

-

вы можете использовать strict_encode64 не включать линию каналы так:

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

возвращает

=> "XUFAKrxLKna5cZ2REBfFkg==" 
+0

Очень приятно. Я думаю, что нужно использовать проверку ('p') вместо' puts', чтобы найти такие различия. –

+0

Это действительно приятно. Оно работает. Я был совершенно в недоумении, почему литерал будет работать, но переменная не будет даже, если отображаемая строка будет такой же. Это объясняет это. Большое спасибо. – liferunsoncode

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