【发布时间】: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