ios支付安全 指纹支付


安全性

开启指纹支付的必须满足以下安全条件:
  • 1 . 开启指纹支付, 需读完指纹支付协议, 验证交易密码, 才可以开启指纹支付

  • 2 . 判断是否是越狱手机, 越狱手机禁止开启指纹支付

  • 3 . 指纹识别功能是iphone 5S之后推出的.SDK是iOS 8.0推出! 判断只有ios8以上的系统才可以使用

  • 4 . 获取 手机用户UUID, 避免不同设备登录. 判断设备登录(可以换种方式判断: 用户第一次使用判断是否开启了指纹支付,存本地)

      指纹识别功能是iphone 5S之后推出的.SDK是iOS 8.0推出!
    
      推出指纹识别功能的目的,是为了简化移动支付环节,占领移动支付市场.
    
      虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。
    
      指纹验证功能的最低硬件支持为iPhone5s,iPad 6,iPad mini 3这些有touch ID硬件支持的设备。
    

判断手机是否越狱

1. 判定常见的越狱文件
  /Applications/Cydia.app

  /Library/MobileSubstrate/MobileSubstrate.dylib

  /bin/bash

  /usr/sbin/sshd

  /etc/apt

  这个表可以尽可能的列出来,然后判定是否存在,只要有存在的就可以认为机器是越狱了。
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])  
  
const char* jailbreak_tool_pathes[] = {  
    "/Applications/Cydia.app",  
    "/Library/MobileSubstrate/MobileSubstrate.dylib",  
    "/bin/bash",  
    "/usr/sbin/sshd",  
    "/etc/apt"  
};  
  
- (BOOL)isJailBreak  
{  
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {  
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {  
            NSLog(@"The device is jail broken!");  
            return YES;  
        }  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
} 
2. 判断cydia的URL scheme
  URL scheme是可以用来在应用中呼出另一个应用,是一个资源的路径(详见《iOS中如何呼出另一个应用》),这个方法也就是在判定是否存在cydia这个应用。
- (BOOL)isJailBreak  
{  
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {  
        NSLog(@"The device is jail broken!");  
        return YES;  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
}  

3. 读取系统所有应用的名称
这个是利用不越狱的机器没有这个权限来判定的。
#define USER_APP_PATH                 @"/User/Applications/"  
- (BOOL)isJailBreak  
{  
    if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {  
        NSLog(@"The device is jail broken!");  
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];  
        NSLog(@"applist = %@", applist);  
        return YES;  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
}  
4. 使用stat方法来判定cydia是否存在
  这个方法本身思路还是通过判定cydia应用,但方法是用的stat函数,同时会判定是否有注入动态库。
#define CYDIA_APP_PATH                "/Applications/Cydia.app"  
int checkInject()  
{  
    int ret;  
    Dl_info dylib_info;  
    int (*func_stat)(const char*, struct stat*) = stat;  
      
    if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {  
        return 0;  
    }  
    return 1;  
}  
  
int checkCydia()  
{  
    // first ,check whether library is inject  
    struct stat stat_info;  
      
    if (!checkInject()) {  
        if (0 == stat(CYDIA_APP_PATH, &stat_info)) {  
            return 1;  
        }  
    } else {  
        return 1;  
    }  
    return 0;  
}  
  
- (BOOL)isJailBreak  
{  
    if (checkCydia()) {  
        NSLog(@"The device is jail broken!");  
        return YES;  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
}  
5. 读取环境变量
  这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib
char* printEnv(void)  
{  
    charchar *env = getenv("DYLD_INSERT_LIBRARIES");  
    NSLog(@"%s", env);  
    return env;  
}  
  
- (BOOL)isJailBreak  
{  
    if (printEnv()) {  
        NSLog(@"The device is jail broken!");  
        return YES;  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
}  
当然,判定一个设备是否越狱时,可以多种方法并用以确保准确。这里我还想说的是越狱有完美越狱还有非完美越狱,这本身就不是官方有保证的行为,所以情况也是复杂多变。iOS7针对沙盒机制也有了改进升级,有些情况对新的版本或许是不合适的,这点还需要实际情况实际处理。

指纹支付核心代码

方案

  • 首先导入头文件#import <LocalAuthentication/LocalAuthentication.h>

      #import <LocalAuthentication/LocalAuthentication.h>
    
  • 在application里面实现


#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])  
  
const char* jailbreak_tool_pathes[] = {  
    "/Applications/Cydia.app",  
    "/Library/MobileSubstrate/MobileSubstrate.dylib",  
    "/bin/bash",  
    "/usr/sbin/sshd",  
    "/etc/apt"  
};  
 // yes == 越狱机, no == 非越狱
- (BOOL)isJailBreak  
{  
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {  
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {  
            NSLog(@"The device is jail broken!");  
            return YES;  
        }  
    }  
    NSLog(@"The device is NOT jail broken!");  
    return NO;  
} 

- (void)setFingerprint{

// 1. 判断是否是越狱手机
if(![self isJailBreak]){

// 2 . iOS 8及以上版本执行-(void)authenticateUser方法,方法自动判断设备是否支持和开启Touch ID
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        NSLog(@"你的系统满足条件");
        // 3 . 是否开启指纹支付 && 是否已登录
        if ([JCCore getFingerprint] && [JCCore is_login]) {
        UIView *v = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds ];
        v.backgroundColor = [UIColor yellowColor];

        //创建LAContext
        LAContext *context = [LAContext new];
        //这个属性是设置指纹输入失败之后的弹出框的选项
        context.localizedFallbackTitle = nil;
        NSError *error = nil;
        // 4 . 是否支持指纹
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
              [_window addSubview:v];
              // 切换到主线程处理
            }];
            NSLog(@"支持指纹识别");
            [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要验证您的指纹来确认您的身份" reply:^(BOOL success, NSError * _Nullable error) {
                if (success) {
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                      [v removeFromSuperview];
                    }];
                    [v removeFromSuperview];
                    NSLog(@"验证成功 刷新主界面 %@",[JCCore get_employee_info]);

                }else {
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                     // 切换到主线程处理
                        [v removeFromSuperview];
                        [JCCore quitOut];
                         [self go_login];
                    }];

                    NSLog(@"%@",error.localizedDescription);
                    switch (error.code) {
                        case LAErrorSystemCancel:
                        {
                            NSLog(@"系统取消授权,如其他APP切入");
                            break;
                        }
                        case LAErrorUserCancel:
                        {

                            NSLog(@"用户取消验证Touch ID");
                            break;
                        }
                        case LAErrorAuthenticationFailed:
                        {
                            NSLog(@"授权失败,请手动登录");
                            break;
                        }
                        case LAErrorPasscodeNotSet:
                        {
                            NSLog(@"系统未设置密码");
                            break;
                        }
                        case LAErrorTouchIDNotAvailable:
                        {
                            NSLog(@"设备Touch ID不可用,例如未打开");
                            break;
                        }
                        case LAErrorTouchIDNotEnrolled:
                        {
                            NSLog(@"设备Touch ID不可用,用户未录入");
                            break;
                        }
                        case LAErrorUserFallback:
                        {
                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                NSLog(@"用户选择输入密码,切换主线程处理");
                            }];
                            break;
                        }
                        default:
                        {
                            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                                NSLog(@"其他情况,切换主线程处理");
                            }];
                            break;
                        }
                    }
                }
            }];
        }else{
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
             // 切换到主线程处理
                [v removeFromSuperview];
                [JCCore quitOut];
                [self go_login];
            }];
            NSLog(@"不支持指纹识别");
            switch (error.code) {
                case LAErrorTouchIDNotEnrolled:
                {
                    NSLog(@"TouchID is not enrolled");
                    break;
                }
                case LAErrorPasscodeNotSet:
                {
                    NSLog(@"A passcode has not been set");
                    break;
                }
                default:
                {
                    NSLog(@"TouchID not available");
                    break;
                }
            }

            NSLog(@"%@",error.localizedDescription);
        }

    }
    }else {
        NSLog(@"你的系统版本太低, 不能使用指纹支付");
    }
    }else {
    NSLog(@"为了安全支付环境, 越狱手机禁止使用指纹支付");
    }
    
}

参考原文作者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 如果你看完书中的所有例子,你很可能已经做完你的实验和在已经越狱的iPhone上的研究。因为和许多人一样,几乎所有的...
    fishmai0阅读 15,887评论 2 42
  • 简述: 在类似支付宝为首的应用以及各种理财等涉及钱财对安全性要求较高的应用中,目前普遍对关键数据都做了安全访问限制...
    C_HPY阅读 2,943评论 0 18
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,782评论 25 707
  • 我正在参加怦然心动·邂逅你的11封情书——1111情书交友创作大赛,快来给我写情书吧。 昵称:樱落鱼 地点:龙岩 ...
    谈恋爱不可马虎阅读 346评论 1 2
  • 那一年,你年方二十二 脚踩废墟,旁边那幢略显沧桑的学生宿舍楼,多少人在这里刻下了青春年华,那沧桑的楼层,记录下了那...
    civind阅读 316评论 0 1