iOS密码钥匙串存储处理指南

现象

苹果在开启“自动填充密码”开关时,当您的APP密码存储显示为openinstall.io时,会看到如下图所示情况:

结论和出现原因

1、对于普通终端用户
结论:并不会造成密码泄露。该密码是由iOS系统加密保存,并且始终只有用户本人可见。

原因:当您的APP保存的密码钥匙串上方显示有openinstall.io或其他与APP企业无关的域名时,并非密码泄露或同步到该域名企业下了,而是iOS APP在开发时未对密码钥匙串保存的“标识”做额外的开发处理,从而让密码钥匙串上方显示为自己APP企业的域名。
如果开发者未进行特殊的配置处理,iOS系统保存密码钥匙串时会自动取用APP中的关联域名,如果有配置多组的关联域名则会自动取其中某一个作为密码钥匙串的“标识”,此时如果APP刚好使用了openinstall或其他有需要配置关联域名的第三方平台,就可能被作为保存密码钥匙串的“标识”了。所以APP用户保存的密码钥匙串就会显示第三方平台那边提供的关联域名。
上述情况并不会造成iOS密码的泄露,openinstall.io或其他域名在密码钥匙串存储功能里面只是iOS作为一个方便用户区分密码来源的“标识”,简单说就是一个备注作用。iOS系统并不会将设备的密码钥匙串存储到或发送给其他企业。

2、对于APP开发人员
如果配置了多个关联域名,而又没有做特殊处理的情况下,用户存储的密码所标识的域名,会随机存储在某个关联域名下(除非用户通过safari登录过相关网站并被系统绑定过相关域名)。

原因:首先,App开发时,密码输入模块使用了苹果自带的textfield。App用户在填充密码时,如果该textfield设置了属性secureTextEntry=YES,则在切换页面时会出现“储存密码”的弹窗,如果用户点击了储存按钮,则密码会保存在相关的关联域名中,并且在下一次输入密码时,会有自动填充密码提示,包括之前的关联域名也会出现在键盘中。

解决方案

1、修改AASA文件,用户需要自己提供一个域名(比如为xxx.aaaaaa.com,支持https),并在其下添加AASA文件(文件名必须为apple-app-site-association,没有后缀),文件中添加设置:

{
"webcredentials": {
        "apps": [
            "xxxxxxxx.com.xxx.example"
        ]
    }
}

apps中的"xxxxxxxx.com.xxx.example"代表应用的APPID(application-identifier)

2、APP中,在关联域名(Associated Domains)中添加一项:
webcredentials:xxx.aaaaaa.com
xxx.aaaaaa.com为步骤1中对应的域名。
如上处理后,密码会显示保存在顶级根域名(aaaaaa.com)下。

备注:如果APP里面开发人员没有使用到苹果自带的textfield来开发密码输入模块,则不需要进行上述的处理或修改。