Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果添加了指纹,则ios8 TouchID检测_Ios_Ios8_Fingerprint_Touch Id - Fatal编程技术网

如果添加了指纹,则ios8 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

我正在研究苹果的TouchID,更准确地说是本地认证器。 到目前为止,文档非常稀少。 主要是这样:

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