针对Objective C的Google身份验证器

时间:2017-04-10 08:41:04

标签: objective-c google-authentication two-factor-authentication authenticator

我正在开发一款使用Google身份验证器的应用。对于此方案,Web应用程序通过Google身份验证器生成QRCode。而且我读了这个QRCode,通过移动应用程序中的Google身份验证生成OTP。我使用下面的代码来创建OTP。当我检查这个创建的OTP总是错误的。我使用Google身份验证器移动应用程序来检查我的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];

}

0 个答案:

没有答案