Google Authenticator For Objective C
Я занимаюсь разработкой приложения, которое использует Google Authenticator. Для этого сценария веб-приложение генерирует QRCode через Google Authenticator. А потом я прочитал этот QRCode для генерации OTP через Google Authentication в мобильном приложении. Я использую приведенный ниже код для создания OTP. Когда я проверяю это созданное OTP всегда неправильно. Я использую мобильное приложение Google Authenticator, чтобы проверить правильность или неправильность моего OTP.
Кто-нибудь может мне помочь?
- (NSString *)generateOTPWithCounter:(uint64_t)counter {
CCHmacAlgorithm alg;
NSUInteger hashLength = 0;
alg = kCCHmacAlgSHA256;
hashLength = CC_SHA256_DIGEST_LENGTH;
NSMutableData *hash = [NSMutableData dataWithLength:hashLength];
counter = NSSwapHostLongLongToBig(counter);
NSData *counterData = [NSData dataWithBytes:&counter
length:sizeof(counter)];
CCHmacContext ctx;
CCHmacInit(&ctx, alg, [self.secret bytes], [self.secret length]);
CCHmacUpdate(&ctx, [counterData bytes], [counterData length]);
CCHmacFinal(&ctx, [hash mutableBytes]);
const char *ptr = [hash bytes];
unsigned char offset = ptr[hashLength-1] & 0x0f;
uint32_t truncatedHash =
NSSwapBigIntToHost(*((uint32_t *)&ptr[offset])) & 0x7fffffff;
uint32_t pinValue = truncatedHash % kPinModTable[8];
return [NSString stringWithFormat:@"%0*u", 8, pinValue];
}
РЕДАКТИРОВАТЬ: я выясняю эту проблему. Теперь он работает правильно. я использую код ниже для NSData
-(NSData *)base32Decode:(NSString *)string {
GTMStringEncoding *coder =
[GTMStringEncoding stringEncodingWithString:kBase32Charset];
[coder addDecodeSynonyms:kBase32Synonyms];
[coder ignoreCharacters:kBase32Sep];
return [coder decode:string error:nil];
}