我想知道如何在ruby中生成hmac-sha1哈希,就像在iOS中生成一样。到目前为止,iOS中的哈希值与通过Ruby生成的哈希值不匹配。 这是通过iOS应用程序和Web应用程序验证提供用户名和密码的用户。
到目前为止,我有:
iOS代码
+ (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {
NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding];
NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding];
unsigned char result[20];
CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], result);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", result[i]];
return output;
}
Ruby代码
def self.signature(base_string, consumer_secret=HOST_KEY)
require "base64"
digest = OpenSSL::Digest.new('sha1')
hmac = OpenSSL::HMAC.digest(digest, consumer_secret, base_string)
hmac = Base64.encode64(hmac)
xx_log("SIGNATURE", hmac)
return hmac
end
在Ruby中调用函数
string_for_hash = params[:username].to_s.downcase + ' ' + params[:password].to_s
params[:hash] = ApiKey.signature(string_for_hash)
提前致谢。
答案 0 :(得分:2)
<强>解决方案强>
结果应该与通用的hmac sha1转换匹配。无需翻译iOS代码。
def hmac_sha1(data, secret=HOST_KEY)
require 'base64'
require 'cgi'
require 'openssl'
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), secret.encode("ASCII"), data.encode("ASCII"))
return hmac
end