其实 系统SecGenerateKeyPair生成 或者openssl生成 密钥对 是一样的 用硬件 也就是 Mac系统生成.der和p12文件 植入到代码中 这样生成的密钥对也是用的openssl 和用代码生成的是一样的 而且每次生成密钥对 都是随机的串码 每次都不同 所以主要问题在于存储 因为我们的touchID等登录 需要用同一对密钥对 公钥在注册touchID的时候发给了server 密钥要在将来用touchID登录的时候用来签名 所以问题在于 如何存储这个密钥
主要问题是在 如何存储
SecGenerateKeyPair生成 可以使用Secure Enclave存储到keychain
但是这样存储 TouchID的逻辑整个就变化 不再是点击按钮 弹出TouchID 而是 点击按钮 从keychain去获取密钥 这时候 因为密钥存储是被TouchID保护的 会自动弹出TouchID 验证通过才能拿到密钥 然后做签名验证 包括对TouchID的验证都可以设置
这种情况 失败三次五次的逻辑没法控制 弹出的信息也没法控制 点击按钮获取密钥 弹出touchID验证 三次后 消失 再次点击 再弹出 验证两次 这时候 会弹出锁屏框 再次点击还能继续验证touchID 也就是五次的时候 没法停止了
使用SecureEnclave生成密钥对并存储 将公钥交给server 然后用密钥来签名 看似拿到了密钥 其实并没有 只是一个引用
经过测试 发现 好像生成的时候 不需要验证touchID 拿出来用的时候 需要验证touchID
苹果在这边举了个简单例子,如何利用Touch ID进行登录。客户端生成一对公私钥,公钥发给服务器,客户端在通过Touch ID校验后,加密一段内容(私钥签名操作),将内容和结果发送给服务器,服务器取出公钥进行验签。如果一致,则通过验证。
之前openssl生成的 存储在keychain 没有保护 越狱就能拿到
系统生成 通过Secure Enclave存储在keychain 被TouchID保护 需要验证TouchID才能拿到
经过测试 发现 只要带上kSecAttrTokenIDSecureEnclave 就不能生成 密钥对 应该是必须配合TouchID才能生成吧
或者尝试在真机测试吧
切换到keypair 能否实现同样的 处理三次五次的逻辑 这个逻辑应该是可以实现的 但是不能确定
能否生成和openssl同样的 公钥密钥 不影响使用的 当然可以
现在简单的方法是 加混淆 加密后再存储 例如 将密钥分成三段 以不同的名字存起来 混淆 给密钥中 比如所有字母a后添加字母b 类似这样的混淆 然后可以做RSA Base64加密在存储
目前来看 Secure Enclav 生成的公钥 发送给server 私钥存储 受TouchID保护 取出密钥的时候 需要验证TouchID 并且取出的只是一种映射 不是真正的密钥 这里的TouchID我应该是不能控制的 但是三次五次的逻辑应该可以保证 验证三次 消失 再点击按钮 继续验证两次 消失 再点击 没反应 所以 建议是在三次的时候 就直接修改页面 改到用账户密码登录 message应该是不能控制 而且只能生成256位的ECC算法的密钥对
kSecAttrKeyTypeEC ECC
kSecAttrKeyTypeECSECPrimeRandom ECC椭圆曲线 椭圆曲线是iOS10之后的 包括一些新的方法 都是iOS10之后 具体看官方demo
都是256位
还有类似 指纹有变更 这种情况 现在能不能拿到 也不清楚 只是知道 可以设置成 指纹有变更 就密钥取不出来 这个是可以设置的 但是能不能具体拿到 是因为这个原因 然后对应的给message 这个还不确定
麻烦的点很多
注意在产生新的公私钥对前需要调用 deleteKeyAsync ,如果私钥已经存在调用 SecKeyGeneratePair 是会产生新的公私钥对,但是keychian中已经存在的私钥是不会被替换的
其实还有一个想法 就是还是用openssl生成RSA的密钥对 然后 通过keychain存储起来 但是受touchID保护 拿出来的时候 需要验证touchID 也就是逻辑差不多 但是不用Enclav去存储 也就不用生成ECC密钥 而且这种方法 应该可以控制touchID的回调 应该可以控制 。。。 暂时了解这些
现在最大的问题是 怎么能配合TouchID使用 也就是获取密钥的时候 弹出的TouchID验证 怎么监听他的回调 从而实现 三次五次message 且刷新页面的需求
而且记得要加版本判断 iOS版本>=11.3的时候 就是kSecAccessControlBiometryAny 因为包含了FaceID 而不是
kSecAccessControlTouchIDAny
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



