如何将iOS功能转换为Ruby。生成hmac-sha1哈希?

时间:2014-03-19 23:01:17

标签: ios ruby-on-rails ruby xcode

我想知道如何在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)

提前致谢。

1 个答案:

答案 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