2016-02-24 24 views
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代码相同。

谢谢

+0

为了让你开始,ruby的默认编码不是你的iOS代码的ASCII码。使用'key.encoding'作为线索。 – Rots

+0

你有没有花时间看Ruby代码中'key'的实际值? 'String#unpack'返回一个数组,并且在该数组上调用'to_s'将返回一个如下所示的字符串,括号和all:'[“e,\ x84P \ xB6R * VR \ xFD,cQ \ xB2 \ x86 \ xD5 \ XC ......“]'。我有一种感觉,那不是你实际想用作钥匙的字符串。 –

+0

嘿约旦,是的,我知道如何解压缩看起来在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

回答

0

这是什么在最后为我工作。

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];