Realm Mobile Platform 是否可以进行端到端加密?

Is end-to-end encryption possible with Realm Mobile Platform?

在客户端设备上,可以使用用户独有的加密密钥设置同步领域并存储在设备钥匙链中,因此数据在客户端上加密存储。 (相关问题:

领域对象服务器和客户端可以通过 TLS 进行通信,因此数据在传输过程中是加密的。

但是 Realm 对象服务器似乎没有使用加密存储数据,因为管理员用户能够通过 Realm 浏览器访问所有数据库内容 (https://realm.io/docs/realm-object-server/#data-browser)。

是否可以设置 Realm Mobile Platform 以便用户数据被端到端加密,例如只有用户(甚至服务器管理员)才能访问解密密钥?

由于我们处理冲突解决的方式,我们目前无法提供端到端加密,正如您正确推断的那样。让我们详细介绍一下冲突解决方案。

为了按照我们的方式处理冲突,我们使用了一种叫做 operational transformation 的东西。这意味着客户端不是直接发送数据,而是告诉服务器更改的意图,而不是结果。例如,当两个用户编辑文本字段时,我们会告诉服务器 insert(data='new text', offset=0) 因为第一个用户在文本字段的开头添加了数据,而 insert(data='some more stuff', offset=10) 因为第二个用户在中间添加了数据领域的。这两个单独的操作允许服务器唯一地解析发生的事情,并且对两次写入进行无冲突的解析。

这也意味着如果我们加密所有内容,服务器将无法处理此冲突解决。

话虽这么说,但这是针对当前版本的。我们确实有一些关于我们如何在未来处理这个问题的想法,同时提供(某种程度的)加密。主要是这意味着客户端需要做更多的工作,并且可能会找到一种新的算法,让我们可以告诉客户端意图,并让客户端弄清楚如何合并所有内容。不过,这是一个二次问题,所以我们不愿在客户端做太多工作,因为它真的会耗尽电池电量。

这对于某些用户来说可能是可以接受的,这就是我们正在研究它的原因。基本上,会有一个权衡。正如那句老话所说:快速、安全、方便:二选一。我们只需要弄清楚如何正确处理它。

我刚刚打开了一个关于可能使用 Tresorit 的 ZeroKit 来解决所提出的 end-to-end 加密问题的功能请求。听起来冲突解决的实施仍然会引起问题,但也许有不同的冲突解决级别可以应用于那些不需要实时动态编辑单个数据字段(如患者健康数据,其中只有单个临床医生在任何给定时间都真正编辑过记录)。

https://github.com/realm/realm-mobile-platform/issues/96