Проблемы с выходом SHA1 в base64 и HMAC в HEX ios iphone

Я получаю удовольствие от реализации методов SHA1 и HMAC в iPhone Applecation. Мне нужен доступ к веб-сервису (который я не контролирую), и они требуют шифрования SHA1 и HMAC.

Для моего SHA1 в base64 я использую следующий подход.

    -(NSString*)sha1ith64Base:(NSString *)stringtoencode
{
    unsigned char result[CC_SHA1_DIGEST_LENGTH]; 
    const char *cStr = [stringtoencode UTF8String];
    CC_SHA1(cStr, strlen(cStr), result); 
    NSData *pwHashData = [[NSData alloc] initWithBytes:result length: sizeof result];  
    NSString *base64 =  [Base64 encode:pwHashData];  

    NSLog(@"SHA1 in base64 %@",base64);

    return  base64;
}

Для моего HMAC я использую следующий подход:

    - (NSString *) encodeWithHmacsha1:(NSString *)k0:(NSString*)m0
{
    const char *cKey  = [k0 cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [m0 cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSString *s = [NSString  stringWithFormat:
                   @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                   cHMAC[0], cHMAC[1], cHMAC[2], cHMAC[3], cHMAC[4],
                   cHMAC[5], cHMAC[6], cHMAC[7],
                   cHMAC[8], cHMAC[9], cHMAC[10], cHMAC[11], cHMAC[12],
                   cHMAC[13], cHMAC[14], cHMAC[15],
                   cHMAC[16], cHMAC[17], cHMAC[18], cHMAC[19]
                   ];

    NSLog(@"HMAC in hex %@",s);    
    return s;
}

Но на самом деле мой вопрос: есть ли способ протестировать эти методы локально, а не использовать веб-сервис, поэтому я могу исключить ошибки из wbservice.

С уважением

РЕШЕНО: для тестирования своих реализаций я использую следующий метод - надеюсь, что когда-нибудь это кому-то поможет.

    -(void)testEncryptions
{
    NSString *key =  @"Jefe";
    NSString *data = @"what do ya want for nothing?";

    NSString *digestAnswerHMAC =@"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79";
    NSString *digestAnswerSHA1HEX =@"cb5551f403fac5fd3d6d1b6329993c3848c468ce";

    NSString *disgest64base=@"SmVmZQ==";
    NSData *stringBytes = [key dataUsingEncoding: NSUTF8StringEncoding]; 
    NSString *hash = [Base64 encode:stringBytes];
    //////
    NSLog(@"testing encryptions");
    NSLog(@"testing HMAC encryptions is :%@ should be :%@",[self encodeWithHmacsha1:key :data],digestAnswerHMAC);
    NSLog(@"testing SHA1 in HEX encryption is :%@ should be :%@",[self sha1:key],digestAnswerSHA1HEX);
    NSLog(@"testing base64 is :%@ should be :%@",hash,disgest64base);
    NSLog(@"testing sha1 in 64 1234 is %@ and should be cRDtpNCeBiql5KOQsKVyrA0sAiA=",[self sha1ith64Base:@"1234"]);
}

person Bjarke    schedule 10.10.2011    source источник


Ответы (1)


Чтобы протестировать методы хеширования ключей, вам необходимо установить известный набор тестовых данных. Таким образом, вы знаете, какой ожидаемый результат будет основан на некотором подходящем вводе. Вы можете получить множество различных стандартных тестовых данных из RFC2202.

Таким образом, тестирование ваших реализаций может быть легко выполнено с помощью нескольких модульных тестов, которые сравнивают эти хорошо известные наборы данных.

Если вы хотите проверить, действительно ли вы кодируете запрос к веб-сервису и правильно обрабатываете ответ, вы можете изучить какую-то заглушку или имитацию тестирования. Опять же, вам нужно будет установить известный набор входных данных и ожидаемого выхода.

Когда у вас есть этот эталонный тестовый набор, вы можете реализовать собственный протокол NSURLProtocol, который будет действовать как реальный веб-сервис, но вместо этого предоставит вам «эталонный» ответ. У меня в блоге есть подробное описание этой темы:

person Claus Broch    schedule 10.10.2011
comment
Большое спасибо. Я использовал известные входы / выходы и смог протестировать свои реализации, и они работали, как задумано. Так что, если кому-то нужны SHA1 и HMAC - не стесняйтесь использовать их :) В другой раз я найду время, чтобы прочитать ваш блог :) - person Bjarke; 10.10.2011