0
我在Ruby中有这样的代码,它基于API KEY和一些内容生成数字签名,我尝试创建一些iOS代码来复制此代码,但没有人可以帮我解决问题。iOS API密钥来自Ruby代码
红宝石
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代码相同。
谢谢
为了让你开始,ruby的默认编码不是你的iOS代码的ASCII码。使用'key.encoding'作为线索。 – Rots
你有没有花时间看Ruby代码中'key'的实际值? 'String#unpack'返回一个数组,并且在该数组上调用'to_s'将返回一个如下所示的字符串,括号和all:'[“e,\ x84P \ xB6R * VR \ xFD,cQ \ xB2 \ x86 \ xD5 \ XC ......“]'。我有一种感觉,那不是你实际想用作钥匙的字符串。 –
嘿约旦,是的,我知道如何解压缩看起来在Ruby上,这是我想用于该功能,不幸的是我不能改变红宝石代码。 “e,\ 204P \ 266R *VRý,cQ²ÕÉr×H2 \ 277 \ 257!\274ça^ \ 220,\ 023”是ruby的unpack.to_s。我试着解码关键的ios到64,并且我得到了类似的东西,但是没有八进制“e,P¶R*VRý,cQ²ÕÉr×H2¿!¼ça^”,但是当我用它作为键时,我得到了零cKey和代码中断... – Lugoland