指纹登录是怎么跑起来的( 三 )

  • 在开启指纹阶段,已经将设备唯一标识、客户端公钥绑定到了用户记录,所以签名验证通过后,就可以生成当前用户的登录Token,并在后续的客户端与服务端的一般交互中使用这个Token 。在关键的交互,比如支付中,还是要使用指纹认证这种安全性更高的方式 。
  • 以上就是APP中的指纹认证原理,指纹登录和指纹登录的过程差不多,只不过支付需要更高的安全等级,指纹认证可以满足这个安全要求 。
    客户端身份认证的问题在上文APP的指纹注册阶段,客户端生成了一对非对称密钥,用于后续服务端认证客户端的身份,这个密钥在当前的手机中已经有了成熟的安全存储和使用方法,这就是TEE(可信执行环境):
    客户端私钥被TEE安全密钥加密存储在手机中,目前没有破解之法;同时还可以指定只有通过了本机指纹认证才能使用私钥对数据进行签名和加密;再者如果手机中加入了新的指纹或者删除了指纹,存储的私钥就会失效;所以密钥的存储和使用是可以保证安全的 。
    但是还存在其它的安全隐患:
    1、服务端无法确认上传的客户端公钥能否代表客户端身份,任何程序都可以生成一对非对称密钥,然后对数据进行签名,再把公钥一起发到服务端,服务端仅能验证签名的正确性,但是无法验证公钥的来源,也就无法验证客户端的身份 。某些解决方案中会在客户端集成一个认证器SDK,这个SDK生成的认证信息中会携带一些特殊识别信息,而且每个应用每个机器不同,很难破解,后端可以据此判断是在集成了认证器SDK的应用中发起的 。但是也有一些难题,识别信息的生成方法可能会被破解,还有怎么确认是用户发起的还是恶意程序发起的?
    2、密钥生成过程中可能被黑客替换,存储和使用再怎么安全也无济于事了 。这个在微信的技术资料中提到过,Android的密钥生成有被拦截的可能,不确定当前是不是解决了 。这也说明底层框架和操作系统也可能是不可信的,在某些场景下必须慎重考虑 。
    指纹登录是怎么跑起来的

    文章插图
     
    3、以上两个问题在Root或者越狱之后的手机中更严重,APP、SDK和操作系统都无法信任了,所以很多金融类APP不支持在Root或者越狱的手机上使用指纹认证,不过道高一尺魔高一丈,还是有一些方法来欺骗APP,这也不乏部分用户的支持(自作X啊) 。
    这个问题有好的办法解决吗?有,设备出厂前就把私钥保存到TEE中 。
    Android中的密钥安全大家应该知道Android系统是开源的,很多手机厂商都在生产Android手机,市面上有多个厂商在竞争,谁也不服谁,所以要想推广上文提到的出厂前内置私钥的方法,就必须统一标准 。在国内腾讯和阿里具备这样的影响力,腾讯搞了SOTER,阿里搞了IFAA,两者都要求手机厂商在产线上生成一对非对称密钥,私钥写入手机TEE,即使拿到了手机当前也没有破解之法,私钥也就不会被泄漏,除非手机厂商搞事情,不过如果手机厂商真的这样做了,就离倒闭不远了;公钥上传到认证服务器,认证的时候用于验证手机APP上传的数据签名,验证通过了就能代表是在对应的手机发起的认证 。
    同时为了推广这个技术,这种协议还支持别的厂商APP接入进来 。但是这样就很容易泄漏APP的商业隐私,比如SOTER每次支付都要去腾讯的认证服务器认证一下,据此就可以推断你的业务行为和交易量,所以SOTER又搞了应用密钥和业务密钥,来尽量消除这个商业风险;同时针对Android密钥生成可能被拦截的问题,让手机厂商装个补丁包就解决了,比如替换掉不安全的中间环节 。下面来看下应用密钥和业务密钥的产生过程 。
    应用密钥产生流程:应用密钥在应用首次安装的时候生成,应用密钥的私钥保存在手机端,并使用出厂前内置的私钥签名,然后发到腾讯的认证服务器验证签名,此时应用密钥的公钥会保存到应用的后台 。
    指纹登录是怎么跑起来的

    文章插图
     
    业务密钥产生流程:在使用登录或者支付的指纹认证注册的时候,应用会再生成一个业务密钥,业务密钥的私钥还是保存在手机端,业务密钥使用手机端的应用密钥进行签名,验证也只需要在应用的后台验证就可以了,此时和腾讯的认证服务器就没有关系了 。
    指纹登录是怎么跑起来的

    文章插图
     
    这样腾讯就不知道你的实际业务运营情况了,比如每天在线支付多少笔,但是APP安装量还是免不了会暴漏出来,话说APP都要上应用市场的,这个信息其实早就公开了 。


    推荐阅读