【问题标题】:iOS API key From Ruby CodeiOS API 密钥来自 Ruby 代码
【发布时间】:2016-06-07 09:16:49
【问题描述】:

我在 Ruby 中有这段代码,它根据 API KEY 和一些内容生成数字签名,我尝试创建一些 iOS 代码来复制它,但没有成功可以帮助我。

红宝石

key = "ZSyEULZSKlZS/SxjUbKG1cly10gyv68hvOeIYV6QLBM=".unpack('m*').to_s
hmac = HMAC::SHA256.new key
s = "some\nrandom\data\n"
hmac << s
ds_coded = [hmac.digest].pack('m*')

iOS

const char *cKey  = [@"ZSyEULZSKlZS/SxjUbKG1cly10gyv68hvOeIYV6QLBM=" cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [@"some\nrandom\data\n" cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey),cData , strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = NSString *hash = [HMAC base64EncodedStringWithOptions:0];

两个数字签名总是不同的。我可以在我的 iOS 代码中进行哪些更改以使其与 Ruby 代码相同。

谢谢

【问题讨论】:

  • 为帮助您入门,根据您的 iOS 代码,ruby 的默认编码不是 ASCII。使用key.encoding 作为线索。
  • 您有没有花点时间查看 Ruby 代码中 key 的实际值? String#unpack 返回一个数组,在该数组上调用 to_s 会返回一个字符串,看起来像这样,括号和所有内容:["e,\x84P\xB6R*VR\xFD,cQ\xB2\x86\xD5\xC..."]。我有一种感觉,这不是您真正想用作键的字符串。
  • 嘿乔丹,是的,我知道解包在 Ruby 上的外观,这就是我想要用于该功能的,不幸的是我无法更改 ruby​​ 代码。 "e,\204P\266RVRý,cQ²ÕÉr×H2\277\257!\274ça^\220,\023" 是来自 ruby​​ 的 unpack.to_s 。我尝试在 ios 上对密钥进行 decode64 并且我得到了类似的东西,但没有八进制“e,P¶RVRý,cQ²ÕÉr×H2¿¯!¼ça^”,但是当我使用它作为密钥时,我得到一个 nil cKey 并且代码中断......

标签: ios ruby digital-signature sha256 hmac


【解决方案1】:

这最终对我有用。

NSData *saltData = [[NSData alloc] initWithBase64EncodedString:key options:0];
NSData *paramData = [somdata dataUsingEncoding:NSASCIIStringEncoding];
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH ];
CCHmac(kCCHmacAlgSHA256, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
NSString *base64Hash = [hash base64EncodedStringWithOptions:0];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2011-11-19
    相关资源
    最近更新 更多