没想到大家讨论这么热烈,但是发现存在一个普遍的认识误区:就是把“ end2end 的加密”与“是否可能被 MITM 或第三者解密”做了强关联。还是苹果的宣传牛逼。
我觉得这个问题得从原理上来讲,因为“ end2end 加密”其实只是一个商业宣传术语,而不是一个严格的算法描述。所以纠结这个是没有意义的。
稍微具体一点来说吧。
iMessage 的消息是否只能被两个手机解密,完全取决于 Apple 的具体密钥与交换算法实现。
对于大多数常见的非对称算法,比如 rsa 等:
假如是手机本地生成了自己的 private key 与 publickey,然后相互把这个 publickey 扔给对方,把 privatekey 留在本地。那这种实现方式目前是在数学上被证明安全的。除非有 privatekey,否则第三方无法解密(毕竟还没有人解出 P=NP 不是?)
但是!(老师教了要怎么抓重点吧?)
苹果的 iMessage 实现非常复杂,因为需要多终端解密。那么,可以完全确认的是,苹果的服务器是持有密钥的。
继续从“持有密钥”说下去:
它虽然“持有密钥”,但这个密钥本身也有可能是被加密存储的,并且我倾向于,苹果也是把密钥本身加密存储的(毕竟明文存储用户密钥这种事太沙雕了,和 csdn 有啥两样?)
下面继续解释,为什么 Apple 能支持多终端解密。从上面描述可知,这个问题的关键点就落在了:如何把服务器存储的“被加密”的密钥安全传递到另一个终端上。
还记得在新的苹果设备上登陆 icloud 的过程吗?它必须要用户输入 icloud 密码。那么,假设苹果使用用户的密码作为私钥加密解密那个密钥,那么第三个设备也就拥有用户的 iMessage 私钥了。
整个过程,苹果对用户的私钥内容都一无所知。对用户的密码也一无所知。
这就是苹果声称的“端到端”。实际上这个过程可能比上面要复杂得多,但总的原理都是差不多的。
从这个过程可以看到,即使苹果持有了用户的各种密钥信息,也是可以声称“端到端”的。因为苹果只能看到一堆乱码,MITM 攻击是不可能的,这也是所谓的端到端。
但我想自己杠一下自己:假如苹果想做到能够配合权力机关调查信息,怎么办比较好。
1. 在任何一个交换环节中存着用户的私钥就行了。so easy。但是老爷子的棺材板板可能按不住。
2. 算法上给用户使用被 master 密钥信任的子密钥。由相关单位生成 master 密钥,苹果不持有 master 密钥无法解密内容(责任被撇的干干净净)。用户通过 master 公钥生成子密钥子公钥,加密的内容都是能够被 master 密钥解密的。
3. 还有一些更“优”的针对密钥自身的加密算法,比如 Shamirs Secret Sharing 算法。
https://en.m.wikipedia.org/wiki/Shamir%27s_Secret_Sharing为什么说更“优”呢?因为它允许对于同一个加密场景同时产生 N 个不同的密钥,要求至少提供 N 个密钥里的任意 M 个,才能够对数据进行解密。好比你的保险柜有 10 把不同的钥匙,你把这些钥匙分发给了 10 个不同的人,然后只有这 10 个人里的至少 X 个人拿出钥匙,才能打开保险箱。
这种场景下,你拿一个密钥,某单位拿一个密钥。你用你的,他用他的。完美。苹果压根懒得解密也无法解密你的数据
或者,你拿一个,苹果拿一个,某单位拿一个,生成密钥的时候设置为至少两个密钥才能解密。更完美:设备上,你和 Apple 共同解密;你喝茶的时候,某单位和你的设备共同解密;你砸了设备的时候,某单位和苹果共同解密。
谁都无法自己单方面解密,然后苹果淡定表示:我们根本无法解密用户数据,第三方也无法单独解密用户数据。完美!