код рубина:
a = OpenSSL::HMAC.digest('sha1', 'secret', 'example')
, а затем:
Base64.encode64(a).chomp
урожай
aMp6Zw1+hHVMmwWXoFp/Aaipc20=
iPhone:
+ (NSData *)hmac:(NSString *)input withKey:(NSString *)key {
const char *cstrInput = [input cStringUsingEncoding:NSASCIIStringEncoding];
const char *cstrKey = [key cStringUsingEncoding:NSASCIIStringEncoding];
NSData *data = [NSData dataWithBytes:cstrInput length:input.length];
unsigned char chmac[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cstrKey, strlen(cstrKey), data, [data length], &chmac);
NSData *hmacData = [[NSData alloc] initWithBytes:chmac length:sizeof(chmac)];
return [hmacData autorelease];
}
И
[XICrypto hmac:@"example" withKey:@"secret"];
NSLog(@"HMACData: %@",[HMACData description]);
NSString *HMACEncodedString = [HMACData base64Encoding];
(где метод base64Encoding взят из ответа Алекса Рейнольда о Реализация Cocoa Base 64 для REST Auth )
Результаты дают
Qm+ManmzmtfhpOzFdf8UHW43L5o=
Итакэти методы не выполняют одни и те же операции, почему?
EDIT: дайджест и ключ были обратными в вызове Rails.Исправлено, но результат все еще отличается от вызова iPhone.