苹果手机 iCloud 钥匙串的加密缺陷

什么是 iCloud 钥匙串
苹果钥匙串是苹果电脑,手机,平板上的密码管理器,帮助用户保存管理账号密码。开启 iCloud 云同步后,可以在用户的所有设备间同步账号密码,同时也会备份一份在 iCloud 上。

由于苹果默认会开启 iCloud 云同步,所以绝大多数苹果用户都会使用 iCloud 钥匙串管理密码。
iCloud 钥匙串云同步加密了
我们知道 Google Chrome 保存的密码,并不会先加密,再上传到云端。
虽然 Google 声称在云端进行了加密存储,但是这种加密,对 Google 内部员工,或侵入 Google 服务的黑客来说,是没有防护作用的。显然,我们并不想让 Google 知道我们的密码。
相对而言,苹果做得好一点。在 iCloud 钥匙串安全恢复 一文讲解了苹果怎样加密以防止自己(或者入侵苹果的黑客,FBI?)读取我们保存在钥匙串中的密码(登录双重验证等并不能防范服务端的攻击):
iCloud 钥匙串会将用户的钥匙串数据交予 Apple 托管,但不允许 Apple 读取密码和钥匙串包含的其他数据。
用户的钥匙串通过强密码进行加密。
建立强密码有以下几种方法:
如果用户帐户启用了双重认证,则使用设备密码来恢复托管的钥匙串。
如果未设置双重认证,用户需要通过提供六位数字密码来创建 iCloud 安全码。除此之外,如果未设置双重认证,用户可以自行指定较长的安全码或允许其设备创建随机加密的安全码,他们可以自行记录和保存。
稍微解释一下:
钥匙串中的账号密码等会保存在 iCloud 上,但是苹果不能读取。
钥匙串中的数据使用了强密码加密。
苹果使用设备解锁密码作为强密码。
因为钥匙串中的密码会先使用设备解锁密码加密,然后再保存到 iCloud 上。设备解锁密码是不会上传到 iCloud 的,因此苹果不能从 iCloud 读取钥匙串中的密码。

解密过程反过来:用户新手机从 iCloud 下载钥匙串数据,输入解锁密码,从加密数据中解密出原来保存的密码。
那么这个强密码有多强呢?
绝大多数苹果手机用户,设置的解锁密码只是 6 位数字,甚至是 4 位数字。苹果就是用这个简单的数字密码加密。
插播一则小故事:
苹果公司与FBI联袂上演公关秀?一文指出,在 2015 年,苹果一反常态,以保护隐私的名义拒绝与 FBI 合作,协助解锁一名恐怖分子的 iPhone 5C 手机。当年闹得沸沸扬扬,官司都打到国会了。

几年后,苹果公司让 FBI 访问了一名被指控放火烧警车的示威者的 iCloud 账户 Apple gave the FBI access to the iCloud account of a protester accused of setting police cars on fire。苹果手机上的所有资料,包括密码都默认上传 iCloud 后,想必 FBI 已经不再需要解锁 iPhone 了,直接破解 iCloud 上的数据更简单。
可惜加密有缺陷,1 个东可破解
那么 iCloud 用 6 位数字密码来加密数据,暴力破解需要多长时间呢?我们来估算一下,非常简单!
解锁手机的时候,手机就会计算出一个加密密钥。为了不让用户等太久,大约需要不到 1 秒时间,我们简单按照 500ms 计算。
6 位数字密码并不能直接用来加密,通常会使用 PBKDF2 之类的算法,从 6 位数字计算出加密密钥。
所有 6 位数字密码就是:000000, 000001, ..., 999999,总共是 1 百万个。
所有 6 位数字密码,全部计算一遍需要的时间总共是 50 万秒 ~ 139 小时。
今年 AMD 发布的桌面 CPU 5995WX 有 64 核心 128 线程,而且速度比手机 CPU 更快,用它暴力破解 6 位数字解锁密码,不用 1 小时。
如果用更强大的 GPU 集群破解,那就只是分分钟的事情了。

这显然无法阻止苹果,FBI,或者入侵苹果服务器的黑客破解我们保存在 iCloud 钥匙串中的密码。
苹果犯了什么错?
日常生活中,使用 6 位数字密码 PIN 是非常广泛的。除了手机电脑,银行卡取款密码也都是 6 位数字,那会不会不安全呢?
6 位 PIN 的作用是识别用户身份,如果连续输错几次,需要等待一段时间才能重试,防止坏人暴力破解。如果继续输错,等待重试的时间会越来越长,有可能需要 47 年。

47 年,看起来相当安全
然而,苹果错就错在把用于身份识别的 6 位数 PIN 码用来加密数据了。
虽然比 Google Chrome 不加密好一些,实际作用大约聊胜于无吧。
最后希望苹果能够把文档写得更准确一些:
iCloud 钥匙串会将用户的钥匙串数据交予 Apple 托管,但不允许 Apple 轻松读取密码和钥匙串包含的其他数据。
毕竟还需要付出 1 个东的努力!
评论