#iphone #ios #sha1 #hmac
#iPhone #iOS #sha1 #hmac
Вопрос:
Я с удовольствием провожу время с внедрением методов SHA1 и HMAC в приложении iPhone. Мне нужно получить доступ к веб-сервису (который я не контролирую), и для них требуется шифрование как 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:
@"XXXXXXXXXXXXXXXXXXXX",
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"]);
}
Ответ №1:
Чтобы протестировать ваши методы хеширования ключей, вам необходимо установить известный набор тестовых данных. Таким образом, вы знаете, какой ожидаемый результат будет основан на некотором совпадающем вводе. Вы можете получить множество различных стандартных тестовых данных из RFC2202
Поэтому тестирование ваших реализаций будет легко обрабатываться с помощью нескольких модульных тестов, в которых сравниваются эти хорошо известные наборы данных.
Если вы хотите проверить, что вы на самом деле кодируете запрос в веб-сервис и правильно обрабатываете ответ, вы можете изучить какой-то тупик или макет тестирования. Опять же, вам нужно будет установить известный набор входных данных и ожидаемый результат.
После того, как у вас есть этот эталонный тестовый набор, вы можете реализовать пользовательский NSURLProtocol, который будет действовать как реальный веб-сервис, но вместо этого предоставит вам «ссылочный» ответ. У меня есть подробное описание этой темы в моем блоге:
Комментарии:
1. Большое вам спасибо, я использовал известные входы / выходы и мог протестировать свои реализации, и они работали так, как предполагалось. Так что, если кому-то нужны SHA1 и HMAC — не стесняйтесь их использовать 🙂 В другой раз я найду время, чтобы прочитать ваш блог 🙂