指纹识别, 自打 iPhone5s 出来后就普遍在使用的功能, 大家可能都已经习以为常, 但是当我真正要上这个功能的时候, 反而遇到了一堆问题, 里面隐藏的逻辑最终用了两个版本才完善.
首先说明下这个需求的背景, 公司内部 APP 增加了查看薪资的功能, 但是考虑到隐私安全, 就添加了隐私密码和指纹密码的功能.
初期的需求如下:
1. 隐私密码为 6-10 位大小写字母, 数字, 特殊符号的任意组合, 不要求如何组合;
2. 隐私密码不可与 APP 登录密码相同;(后来由于无接口提供, 取消了校验) ;
3. 设置指纹密码前必须设置隐私密码;
4. 开启指纹密码先输入隐私密码, 再验证指纹;
5. 关闭指纹密码不需要验证;
上面罗列的只是几个要点, 需求肯定不是这么简单几句话写完的, 但是上述逻辑无法覆盖以下场景:
场景一:
员工手机没有录入指纹的时候怎么处理?
因此需求中增加了:
6. 开启指纹先校验手机是否已经设置了指纹;
至此就完成了指纹密码的正向流程, 是不是感觉可以交给研发了? 然而不经意听到交互在旁边说到一句: 手机借给别人......
这里备注下, 我们公司 APP 有手机绑定的功能, 发现账号登录设备变更后会要求输入手机验证码换绑设备.
所以就出现了下面的场景:
场景二:
员工 X 有 A 手机, 员工 Y 有 B 手机;
X 在 A 手机完成了账号登录和指纹密码开启, 这时 Y 借用 A 手机登录了自己账号, 那么 Y 的账号指纹密码状态是什么?
之所以会出现这样问题, 是因为指纹是否开启的信息是留存在手机本地的, 因此刚刚 X 在 A 手机开启指纹后, Y 再用 A 手机登录, 会沿用上个账号的指纹开启状态, 这显然是不合理的, 因此需求中增加了:
7. 指纹是否开启的信息, 留存本地时需要关联工号保存;
总算交付研发了, 我也投到下个需求中去了, 然而第二天交互和我说, 她和研发商量了下, 把开启指纹密码时的校验隐私密码去除了, 我问为什么, 她说因为用户的手机, 他要在自己手机开启指纹, 既然已经验证指纹正确了, 说明他就是手机主人, 那为什么还要验证隐私密码? 于是我和她描述了下面的场景:
场景三:
员工 X 有 A 手机, 员工 Y 有 B 手机;
X 用了 A 手机登录账号, 随后换用 B 手机登录账号, 但是后来忘记退出, 且没有在自己设备回登;
那么 Y 拿回 B 手机后, 如果没有隐私密码校验, 将可以直接可以开启指纹密码, 查看隐私信息;
这时交互表示无奈, 并和研发说了撤销刚刚的修改. 其实如果不用隐私密码二次校验, 还会存在个漏洞:
场景四:
员工 X 有 A 手机, 员工 Y 有 B 手机;
X 和 Y 是同事, 经常借手机, X 因此知道 B 手机的锁屏密码, 那么 X 就可能干出下面的事;
借到 B 手机, 由于有锁屏密码, 因此可以添加自己的指纹, 然后直接开启客户端的指纹密码, 查看隐私信息;
由于这时候已经提测, 所以第一期上线就没有将隐私密码二次校验加回去, 毕竟是内部 APP, 发布比较方便, 然而逻辑的推演又出来了:
场景五:
员工 X 有 A 手机, 员工 Y 有 B 手机;
X 和 Y 是同事, 经常借手机, X 因此知道 B 手机的锁屏密码, 那么 X 又干了一件事;
Y 已经在 B 手机开启了指纹密码, X 借到 B 手机后, 通过锁屏密码在 B 手机中添加了自己的指纹, 于是又能嘿嘿嘿......
这种逻辑是在转测后想起来的, 就计划放在下期完善, 当天晚上测试也提说有这么个漏洞, 我说已经放到二期了, 所以说靠谱的测试还是很重要的, 那么这种情况怎么解决?
这里分开讨论, iOS 端的应用一般是检测指纹管理是否变更, 包括指纹的增删, 一旦指纹管理有变更, 当用户打开应用时, 即使开启了指纹解锁, 也需要先输入隐私密码; 安卓可能是开放程度比较好, 像 "掌上生活"APP 是直接校验当时开启指纹解锁的指纹 ID, 也就是说你用中指打开应用的指纹解锁, 是无法用食指解锁的, 这样安全性很高, 但是成本有点高;
为此我们也就加上需求:
8. 当用户使用应用内的指纹密码时, 若检测到手机指纹管理变更, 则直接要求输入隐私密码, 校验正确后直接进入功能页, 且二次使用不受影响; P.S. 安卓端还需要开会时沟通下是不是也能检测到指纹管理变更
正当我被自己的逻辑折服时, 研发又来打脸了, 哎哟, 好疼......
场景六:
员工 X 有 A 手机, 员工 Y 有 B 手机;
X 在 A,B 手机都登录过自己账号, 且都开启了指纹密码;
某天 Y 借了 X 的账号在 B 手机登录, 抑或是同事关系导致 Y 知道 X 的登录密码; 于是乎 Y 在 B 手机上登录了 X 的账号, 由于之前 X 的账号在 B 手机开启过指纹密码, 那么这一次 Y 可以直接用指纹在 B 手机解锁 X 的隐私信息;
敷完药膏, 脸总算不疼了, 于是就和研发讨论如何保证同一账号的指纹开启只能保留在一台设备上, 是的, 我们又加需求了:
9. 当用户登录应用时, 若 APP 端请求短信验证码, 则本地清空该账号的指纹开启信息;
这是由于一旦应用向服务端校验登录信息且正确时, 服务端会校验该账号上次登录设备是否一致, 若不一致则要求应用端请求短信验证码, 因此一旦应用端请求验证码, 就说明账号登录设备有变, 也就能保证指纹开启信息只会留存一台设备了.
码完收工, 好久不接触这种安全性功能设计, 思维逻辑愈发有些线性考虑, 与诸君共勉.
来源: https://juejin.im/post/5af431daf265da0b7025eea8