端到端加密是即将到来的Nextcloud13的主打功能,允许用户为文件(夹)设置自己的密码,并对文件(夹)进行高安全的加密。 以下是官方介绍:
Nextcloud features an enterprise-grade, seamlessly integrated solution for end-to-end encryption. Currently in proof-of-concept phase and scheduled to be part of Nextcloud 13, it enables users to pick one or more folders on their desktop or mobile client for end-to-end encryption. Folders can be shared with other users and synced between devices but are not readable by the server. Nextcloud采用企业级,无缝集成的端到端加密解决方案。目前处于概念验证阶段并计划成为Nextcloud 13的一部分,它使用户能够在桌面或移动客户端上选择一个或多个文件夹进行端到端加密。文件夹可以与其他用户共享并在设备之间同步,但不能被服务器读取。Nextcloud端到端的加密技术使服务器无需看到数据,同时仍然可以促进设备之间的同步以及与其他用户的共享。它不会通过使用基于浏览器的解密来降低安全性,具有安全的密钥管理功能,因此用户不必交换密码,也不需要重新加密大文件以添加或删除访问权限,而且具有重要的企业功能,如离线恢复密钥和硬件安全模块(HSM)支持。
有些读者可能要问了,加密不是Nextcloud早就有的功能吗?
以我的理解,Nextcloud现有的加密功能基于服务端的配置。加密是由服务端的拥有者来操作,这也意味着,解密也可以由服务端的拥有者来操作,对于用户来说这显然是不安全的。而端到端加密则解决了这个问题,密钥由用户设置,由Nextcloud自行配置加密,服务端的拥有者无法干预,当然也无法读取服务端已被加密的文件了。
同时,无缝集成和易用性以及脱机恢复密钥,审计和HSM支持等关键功能使Nextcloud端到端加密成为其他Nextcloud安全功能(包括服务器端加密和文件访问控制)的完美补充。
功能
[ssbluelist]- 可以加密任意数量的文件夹
- 轻松添加一个由12个字典单词组成的强密码
- 与其他用户安全共享,无需输入密码。
- 高效地共享或撤销共享,而不需要重新加密大文件。
- 支持企业环境的硬件安全模块,可以安全地向用户发放新的密钥。 支持完整的审计日志,而不会影响端到端的安全性。 可以与File Access Control功能相结合,通过特定的用户组阻止特定的文件类型或文件上传,除非它们是端对端加密的。
工作原理
创建并同步身份认证

[ssbluelist]
第一部分:创建
- 我们可以看到,Nextcloud端对端加密由设备的客户端发起,客户端生成一个新的X.509证书请求和私钥
- 证书由服务端登记确认
- 私钥存储在设备的Keychain中
第二部分 同步
- 客户端使用12个关键词(助记符)将私钥进行加密,然后将私钥上传至服务端
- 客户端将关键词(助记符)展示给用户并要求用户保存它们
- 关键词(助记符)存储在Keychain中
第三部分 其它设备访问
当一个新的设备尝试访问被加密的文件时,由于没有私钥,就必须从服务端获取。- 新的设备从服务端获取已被加密的私钥
- 使用之前所提到的12个关键词(助记符)对私钥进行解密
- 新的设备检查私钥是否与证书相匹配
- 私钥和关键词(助记符)存储到新的设备的Keychian中
加密文件夹和添加文件

第一部分 元数据处理(客户端)
- 创建文件夹并在服务端打上标明已加密
- 生成元数据文件
- 生成元数据密钥,加密可以访问该文件夹的所有公共密钥
- 使用元数据密钥加密元数据文件中所有的元数据值
- 将已加密的元数据文件存储至服务端
第二部分 客户端加密文件
- 为文件生成新的128bit加密密钥
- 使用AES/GCM/NoPadding加密文件
第三部分 添加新的加密文件
- 生成随机标识符(UUID)并上传已加密的文件,将随机标识符作为文件的ID
- 将新的文件信息记录到元数据文件中,使用元数据密钥加密
- 更新服务端的元数据文件
总的来说,Nextcloud创建一个端到端的加密文件夹是通过标记一个空文件夹进行端到端加密,创建元数据,加密和上传。该进程受锁定保护,客户端请求服务器锁定,并在所有更改完成并上传后再次释放。 每个文件都使用自己的唯一密钥加密,该密钥存储在元数据文件中。元数据文件中的所有数据依次被安全地加密,文件名和目录结构也被隐藏在服务器上,使用唯一的UUID作为每个文件的名称。