如果添加了指纹,则ios8 TouchID检测
我正在研究苹果的TouchID,更准确地说是本地认证器。 到目前为止,文档非常稀少。 主要是这样:如果添加了指纹,则ios8 TouchID检测,ios,ios8,fingerprint,touch-id,Ios,Ios8,Fingerprint,Touch Id,我正在研究苹果的TouchID,更准确地说是本地认证器。 到目前为止,文档非常稀少。 主要是这样: LAContext *myContext = [[LAContext alloc] init]; NSError *authError = nil; NSString *myLocalizedReasonString = <#String explaining why app needs authentication#>; if ([myContext canEvaluatePoli
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = <#String explaining why app needs authentication#>;
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
// User authenticated successfully, take appropriate action
} else {
// User did not authenticate successfully, look at error and take appropriate action
}
}];
} else {
// Could not evaluate policy; look at authError and present an appropriate message to user
}
LAContext*myContext=[[LAContext alloc]init];
n错误*authror=nil;
NSString*MyLocalizedResonstring=;
如果([myContext CaneValuePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics错误:&authError]){
[myContext评估策略:LAPolicyDeviceOwnerAuthenticationWithBiometrics
本地化原因:我的本地化原因安装
答复:^(布尔成功,N错误*错误){
如果(成功){
//用户身份验证成功,请采取适当的操作
}否则{
//用户未成功进行身份验证,请查看错误并采取适当的操作
}
}];
}否则{
//无法评估策略;请查看authError并向用户显示适当的消息
}
取自
使用指纹进行身份验证的想法很好。但是如果我知道密码,我可以在设备中添加指纹。而且很容易获得密码,就像你坐在火车上的受害者旁边,看着他/她输入密码一样
我想使用指纹作为安全身份验证的一种方式,但希望能够检测自上次请求指纹后是否添加了新指纹
苹果正在为AppStore做这件事。如果要验证AppStore中的事务,并在上次事务之后添加了新指纹,AppStore将请求您的AppleId密码。这是明智的行为,因为手机可能被其他知道密码的人拿走,并添加了自己的指纹以购买昂贵的东西
我的问题:我能检测到自从上次使用本地验证器以来是否添加了新指纹吗?简而言之;没有
更详细一点;LocalAuthentication
框架是一个严密保护的黑盒子。你从中得到的信息非常有限。你与它的互动是这样的:
- 询问它是否能够对某种类型的保险单进行身份验证(在撰写本文时,只有一种保险单可用-生物识别(触摸ID))
- 如果可以的话,让它去做
- 系统将接管实际的身份验证
- 它让您知道身份验证是否成功(如果不成功,它会告诉您原因)
您不知道实际的身份验证过程(例如,使用了哪个手指)。当然,这是故意的。苹果不想也不需要让你访问这些信息。这在iOS9中是可能的。属性evaluatedPolicyDomainState已添加到LAContext 如果修改指纹数据库(添加或删除手指),则evaluatedPolicyDomainState返回的数据将更改。无法确定更改的性质,但通过比较不同evaluatePolicy调用后evaluatedPolicyDomainState的数据,可以检测到指纹集已被修改
请注意,仅当调用evaluatePolicy并成功执行触摸ID身份验证时,或当canEvaluatePolicy成功执行生物识别策略时,才设置此属性。如Keith所述,在iOS 9中,这是可能的。你应该这样做
let context = LAContext()
context.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil)
if let domainState = context.evaluatedPolicyDomainState
where domainState == oldDomainState {
// Enrollment state the same
} else {
// Enrollment state changed
}
每次添加或删除指纹时,域状态都会更改。您需要调用
CaneAvaluePolicy
以更新evaluatedPolicyDomainState
。这是验证是否添加或删除指纹的解决方案,Swift和ObjC解决方案的区别在于CaneAvaluePolicy
只需验证是否有更改,而evaluatePolicy
将打开模式验证
Swift 5.2
let context = LAContext()
context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil)
let defaults = UserDefaults.standard
let oldDomainState = defaults.object(forKey: "domainTouchID") as? Data
if let domainState = context.evaluatedPolicyDomainState, domainState == oldDomainState {
// Enrollment state the same
print("nothing change")
} else {
// Enrollment state changed
print("domain state was changed")
}
// save the domain state for the next time
defaults.set(context.evaluatedPolicyDomainState, forKey: "domainTouchID")
目标-C
- (void)evaluatedPolicyDomainState {
LAContext *context = [[LAContext alloc] init];
__block NSString *message;
// show the authentication UI with reason string
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Unlock access to locked feature" reply:^(BOOL success, NSError *authenticationError) {
if (success) {
// load the last domain state from touch id
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *oldDomainState = [defaults objectForKey:@"domainTouchID"];
NSData *domainState = [context evaluatedPolicyDomainState];
// check for domain state changes
if ([oldDomainState isEqual:domainState]) {
message = @"nothing change";
} else {
message = @"domain state was changed";
}
// save the domain state that will be loaded next time
oldDomainState = [context evaluatedPolicyDomainState];
[defaults setObject:oldDomainState forKey:@"domainTouchID"];
[defaults synchronize];
} else {
message = [NSString stringWithFormat:@"evaluatePolicy: %@", authenticationError.localizedDescription];
}
[self printMessage:message inTextView:self.textView];
}];
}
我想补充一点,
-(BOOL)hasFingerPrintChanged
{
BOOL changed = NO;
LAContext *context = [[LAContext alloc] init];
[context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil];
NSData *domainState = [context evaluatedPolicyDomainState];
// load the last domain state from touch id
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *oldDomainState = [defaults objectForKey:@"domainTouchID"];
if (oldDomainState)
{
// check for domain state changes
if ([oldDomainState isEqual:domainState])
{
NSLog(@"nothing changed.");
}
else
{
changed = YES;
NSLog(@"domain state was changed!");
NSString *message = @"Your Touch ID is invalidated, because you have added or removed finger(s).";
}
}
// save the domain state that will be loaded next time
[defaults setObject:domainState forKey:@"domainTouchID"];
[defaults synchronize];
return changed;
}
最好将用户密码等存储在钥匙链中。
我正在使用我建议将evaluatedPolicyDomainState值存储到keychain中,而不是将其存储在NSUserDefault中 您可以将evaluatedPolicyDomainState的数据值转换为字符串,该字符串为44个字符的字符串。下面是将evaluatedPolicyDomainState数据值转换为字符串的代码-
if context.canevaluation策略(.deviceOwnerAuthenticationWithBiometrics,错误:nil){
如果让domainState=context.evaluatedPolicyDomainState{
让bData=domainState.base64EncodedData()
如果let decodedString=String(数据:bData,编码:.utf8){
打印(“解码值:\(解码字符串)”)
}
}
}
希望他们在不久的将来能多打开一点这个界面。如果我不知道是否有人搞砸了touchID设置,那就没什么帮助了。我明白你的意思,但想法是你不必担心认证的细节;你让系统替你处理。这不是经过深思熟虑的,要添加一个新的指纹,我需要每10分钟在公共汽车上、火车上、人行道上输入相同的代码,人们可以从我肩上看到它。如果有人打算使用触摸id进行更多的测试,那么很容易窃取该设备,输入新指纹并滥用新授予的身份验证。这种方式的安全性不如静态短密码。但其思想是,您不会在大多数时间输入密码来解锁设备,而是使用触摸ID,所以人们不太可能看到你进入。这将取决于人们如何在我的应用程序中使用itI集成触摸id。我想使用触摸id作为第二个安全身份验证。我想检测是否添加或删除了新指纹。您能帮我编程使用吗?您最好使用TouchID来解锁密钥链中的令牌,而不是使用本地authenticati