iPhone SHA-1, кодирующий разные результаты от Rails? - PullRequest
1 голос
/ 18 июля 2011

код рубина:

  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.

1 Ответ

3 голосов
/ 18 июля 2011

Да, я вижу ваш комментарий после того, как сам разобрался с этой частью :), ваш вызов по рельсам задом наперед, ваша следующая проблема - кодирование.Когда вам когда-нибудь понадобится правильная длина байтов при использовании строкового кодирования, используйте lengthOfBytesUsingEncoding:.

+ (NSData *)hmac:(NSString *)input withKey:(NSString *)key {
    NSStringEncoding encoding = NSASCIIStringEncoding;
    const char *cstrInput = [input cStringUsingEncoding:encoding];
    NSUInteger inputLength = [input lengthOfBytesUsingEncoding:encoding];
    const char *cstrKey = [key cStringUsingEncoding:encoding];
    NSUInteger keyLength = [key lengthOfBytesUsingEncoding:encoding];

    unsigned char chmac[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cstrKey, keyLength, cstrInput, inputLength, &chmac);

    return [[[NSData alloc] initWithBytes:chmac length:sizeof(chmac)] autorelease];
}

. Я зарегистрировал содержимое данных и получил 68ca7a67 0d7e8475 4c9b0597 a05a7f01 a8a9736d, и если вы вставили его в шестнадцатеричное поле этот переводчик вы получите aMp6Zw1+hHVMmwWXoFp/Aaipc20= в поле base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...