Java 使用faceId/touchId的应用程序的安全性?它是如何工作的?

Java 使用faceId/touchId的应用程序的安全性?它是如何工作的?,java,android,ios,authentication,authorization,Java,Android,Ios,Authentication,Authorization,在我的国家,我们有一个MFA服务,例如,可以接收你的手机号码,然后ping你的手机,你输入一个pin,你就可以通过身份验证。调用此服务的应用程序将返回您的“社会安全号码”等价物 在应用程序中,可按如下方式使用: 您第一次打开应用程序。输入您的电话号码并进行身份验证 该应用程序可能还允许您选择pin,但首次登录后不会提示您再次使用此MFA,它将使用您的面部id或touchId 这是怎么回事 这里有一个猜测: 在注册过程中,会调用MFA服务,它会获取您的“社会保险号”,并将其用作您的用户名 您

在我的国家,我们有一个MFA服务,例如,可以接收你的手机号码,然后ping你的手机,你输入一个pin,你就可以通过身份验证。调用此服务的应用程序将返回您的“社会安全号码”等价物

在应用程序中,可按如下方式使用:

  • 您第一次打开应用程序。输入您的电话号码并进行身份验证
  • 该应用程序可能还允许您选择pin,但首次登录后不会提示您再次使用此MFA,它将使用您的面部id或touchId
这是怎么回事

这里有一个猜测:

  • 在注册过程中,会调用MFA服务,它会获取您的“社会保险号”,并将其用作您的用户名
  • 您输入的pin(可能只有4个字母-非常短,因此我怀疑这一理论)将用作您的密码
  • 用户名和密码(pin)随后存储在您的密钥链/核心存储器中,应用程序会提示您输入faceId/touchId,但随后会发送您的用户/pin以使用API对您进行身份验证
这就是它的工作原理吗?如果是这样的话,4位pin码不是太不安全了吗?我假设,如果您可以使用它进行身份验证,那么任何可以访问您的API的人都可以尝试对其进行暴力攻击。由于它是应用程序使用的API,这意味着它对所有人开放

如果我错了,请纠正我


编辑:我猜可以为每个用户生成一个秘密,并且可以使用该秘密对pin进行加密,使其更长

最现代、最安全的方法不是与依赖方(后端)共享您的秘密(pin),而是使用非对称密钥加密。 例如,我的猜测是:

注册期间

  • 您已成功使用凭据进行身份验证
  • 该设备使用安全Enclave生成密钥对,并使其仅可通过生物识别技术(TouchID、FaceID)访问
  • 公钥被发送到后端
在身份验证过程中

  • 后端通过某个通道向设备发送质询(推送通知?)
  • 设备使用注册期间创建的私钥对质询进行签名,并将其发送到后端

  • 后端验证签名并允许您访问受保护的资源

这是我所期望的现代应用程序的基本安全性

这就是它的工作原理吗?如果是这样的话,4位pin码不是太不安全了吗?我假设,如果您可以使用它进行身份验证,那么任何可以访问您的API的人都可以尝试对其进行暴力攻击。由于它是应用程序使用的API,这意味着它对所有人开放

我不知道他们为什么要你的密码。也许他们想采取一些额外的保护措施,比如:

  • 锁定应用程序,以防生物特征验证失败。PIN可用于解锁应用程序并允许您重试

  • 如果用户禁用了生物识别身份验证方法,请使用PIN作为身份验证方法

在任何情况下,即使4位数字太少,通常也会使用密钥派生函数(like)对PIN进行散列,以降低攻击者的速度并防止暴力攻击。不会存储实际PIN,而是存储哈希

所有这些安全方案现在都在标准化,以确保产品足够安全。如果您觉得有冒险精神,可以看看FIDO UAF协议:

谢谢您的回复,非常详细和清晰。你是否有机会了解Azure广告B2C?你知道我描述的MFA是如何工作的吗?