Cryptomator-保护你云端上的隐私

news2024/9/27 8:15:01

网盘为我们提供了随时随地的获取数据的便利性,同时也大大减轻了你我手机电脑空间不足的压力。但是一旦我们选择使用网盘,也意味着把你的私密数据交出去了。

对于公共资料来说,无非就是提供网盘服务的公司知道了你做了保存这些资料的行为而已。然而对于你私有的数据如照片,视频,笔记,备忘录,一旦你上传了,就等于你自己把所有权交出去了,你永远不知道别人怎么去使用你的数据,即便这些大公司号称会保护你的隐私。(搞不好这些数据就被LLM拿去当训练语料了。)

那是不是我们就得停止使用网盘了呢?那倒不至于因噎废食,只需要牺牲一点便利性,拿起密码学的武器来保护自己就好了。对于我们收集的公共资料来说,完全没有必要加密。保证文件的哈希值不变,反而能帮助我们快速上传(实际并没有真正的上传资料,只是增加了个标识即可)。而对于我们隐私部分的数据,那就需要进行加密了。确保密钥只有自己拥有,那么就没人能知道你放在网盘上是什么东西了。

为什么选择 Cryptomator

那有什么好的加密工具呢?我这里选择了使用Cryptomator, 主要的一个原因是它是一款开源软件,跟我选择Bitwarden的理由是一样的。在Cryptomator的官网里有专门一篇文章[1]来讲述为什么开源能保证提高安全性。

里面用了一个很形象的例子来描述开源的安全性:想象一下你在一个陌生的国家里,晚上到了小镇阴暗角落的一家酒吧,以下情形哪一种听起来更安全:

  • 酒保当着你的面调出来的酒
  • 陌生人给你提供的一杯不知道怎么来的酒

![bartender-vs-stranger][https://cryptomator.org/img/open-source/bartender-vs-stranger@2x.png]

如何使用

Cryptomator 提供了详细的doc来介绍如何使用这个工具。

  1. 创建Vault来存放你的私密文件。
  2. 每个Vault都需要提供一个密码,Cryptomator会对你的Vault进行加密。
  3. 在打开Vault的时候,Cryptomator会创建出Vault对应的一个解密后的文件夹。
  4. 我们可以在解密后的文件夹里面正常存放私密数据,而在Vault里面,永远都是加密后的数据。

而我们同步到网盘的数据,都是Vault里面已经被加密后的数据。

原理

想了解背后的原理,可以看看文档的Security一节。

安全架构

虚拟文件系统

当我们解锁Vault时,Cryptomator会创建一个对应的文件夹来存放解密文件。不同的系统会使用不同的前端。如果找不到对应的虚拟文件系统,则会fallback到基于HTTP协议的WebDAV。

不同系统的默认虚拟文件系统为:WinFsp (on Windows) and macFUSE (on macOS) and FUSE (Linux)

Vault结构

每个Vault都会有一个vault.cryptomator文件,文件内容是一个JWT(json web token),里面包含了一些vault的基本信息,以及要使用哪个masterkey

打开一个Vault的流程如下

  1. 解码vault.cryptomator文件,不对签名进行验证(原因是这时候我们还没有私钥)
  2. 获取kid, 基于kid获取masterkey
  3. 用拿到的masterkey进行签名验证
  4. 确保format和cipherCombo是支持的

Masterkey

每个Vault有一个256位的密钥和MAC masterkey, 这两个key都是通过CSPRNG(Cryptographically Secure Pseudo-Random Number Generator)生成的.

这两个key都被加密之后存放起来,可以有以下两种方式进行使用

  • Cryptomator Hub
  • Masterkey File

使用AES的加密方式,根据用户的口令和随机生成的盐进行加密,并保存在masterkey.cryptomator文件里

加密密钥

![encrypted][https://docs.cryptomator.org/en/latest/_images/key-derivation%402x.png]

解密密钥

![decrpted][https://docs.cryptomator.org/en/latest/_images/masterkey-decryption%402x.png]

Vault密码学

文件头加密

file header保存了特定的元数据,主要是nounce和content key,后续会用于对文件内容的加密。每个文件都会生成对应的一个file header

总共有68 Bytes:

  • 12 bytes的nonce
  • 40 bytes 用于AES-GCM
    • 8 bytes 留待后用
    • 32 bytes AES密钥.
  • 16 bytes tag of the encrypted payload.
headerNonce := createRandomBytes(12)
contentKey := createRandomBytes(32)
cleartextPayload := 0xFFFFFFFFFFFFFFFF . contentKey
ciphertextPayload, tag := aesGcm(cleartextPayload, encryptionMasterKey, headerNonce)

加密文件头

![AES-GCM 加密][https://docs.cryptomator.org/en/latest/_images/file-header-encryption%402x.png]

文件内容加密

明文被split成chunks, 每个chunk都有自己的nounce(看了下AES-GCM,提到IV重复会导致安全漏洞,这可能就是为什么每个chunk都要有自己的nounce的原因)

cleartextChunks[] := split(cleartext, 32KiB)
for (int i = 0; i < length(cleartextChunks); i++) {
    chunkNonce := createRandomBytes(12)
    aad := [bigEndian(i), headerNonce]
    ciphertextPayload, tag := aesGcm(cleartextChunks[i], contentKey, chunkNonce, aad)
    ciphertextChunks[i] := chunkNonce . ciphertextPayload . tag
}
ciphertextFileContent := join(ciphertextChunks[])

加密文件

![加密文件][https://docs.cryptomator.org/en/latest/_images/file-content-encryption%402x.png]

目录id

这里介绍目录如何被加密,其中用sha1哈希值拆成路径,所以最终所有的目录都拥有一样的层级结构

dirIdHash := base32(sha1(aesSiv(dirId, null, encryptionMasterKey, macMasterKey)))
dirPath := vaultRoot + '/d/' + substr(dirIdHash, 0, 2) + '/' + substr(dirIdHash, 2, 30)

文件名加密

文件名先用utf-8进行编码成Normalization Form C以获得唯一二进制表示

ciphertextName := base64url(aesSiv(cleartextName, parentDirId, encryptionMasterKey, macMasterKey)) + '.c9r'

机密文件名
加密文件名

Reference

  1. How You Can Further Increase Your Data Security Through Open Source
  2. Vault Cryptography

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1985424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升用户体验的秘诀:Xinstall带你玩转Web拉起App!

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地触达和使用App&#xff0c;成为了开发者和运营者面临的一大挑战。今天&#xff0c;我们就来揭秘一个能够一键实现Web拉起App的神器——…

类和对象(下)C++

1.初始化列表 1.为什么有初始化列表&#xff0c;它的作用&#xff1f; ->初始化列表&#xff0c;是构造函数初始化的另一种形式。 ->在语法上面理解&#xff0c;初始化列表可以认定为是每个成员变量定义初始化的地方. ->引用成员变量&#xff0c;const成员变量&am…

100个免费可商用图库,一次收藏,众生受益

正版图片太贵 免费图片又有风险 免费可商用图片才是设计师心头所好 &#xff08;当然&#xff0c;土豪除外&#xff09; 以下100个免费可商用图库 一次收藏&#xff0c;众生受益! skr&#xff5e;skr&#xff5e;skr&#xff5e; 1、Unsplash https://unsplash.com/ 建…

6个免费的无损音乐下载网站,建议收藏!

分享6个免费的无损音乐下载网站&#xff0c;都是免费的音乐资源&#xff0c;国内外各种风格的音乐都能找到&#xff01; MyFreeMP3 tools.liumingye.cn/music/ 一个免费的mp3音乐下载网站&#xff0c;里面有丰富的音乐资源&#xff0c;支持在线听歌&#xff0c;也可以下载歌…

找出电脑中的视频文件并把地址输出在记事本文件中,同理通过bat脚本找出需要的其他后缀文件,比如word文件excel文件md文件等

下午的时候&#xff0c;突然很着急&#xff0c;要找到一个之前下载的一个视频文件&#xff0c;我记得是mp4格式的视频文件&#xff0c;但是具体叫什么名字不记得了&#xff0c;更不记得在哪个目录下&#xff0c;所以想了一个办法&#xff0c;通过bat脚本命令&#xff0c;找到所…

Hack The Box-Resource【更新中】

总体思路 信息收集&端口利用 nmap -sSVC itrc.ssg.htb目标开放了两个ssh端口和一个80端口&#xff0c;先查看80端口 网站是一个SSG IT资源中心&#xff0c;主要用于解决网站问题、管理 SSH 访问、清除病毒和解决各种安全问题的权威一站式商店。 后台挂着目录扫描&#x…

threejs加载fbx带tga贴图报错

描述&#xff1a;threejs加载带tga贴图的fbx时&#xff0c;提示 FBXLoader: TGA loader not found, creating placeholder texture for 11\Pylons_A.TGA 方案一&#xff1a; 加载fbx之前&#xff0c;在LoadingManager中添加TGALoader。此方案有两个前提 1、FBXLoader和TGALoa…

JDK-Java IO流概述

JDK-Java IO流概述 概述 一直以来Java三件套&#xff08;集合、io、多线程&#xff09;都是最热门的Java基础技术点&#xff0c;我们要深入掌握好这三件套才能在日常开发中得心应手&#xff0c;之前有编写集合相关的文章&#xff0c;这里出一篇文章来梳理一下io相关的知识点。 …

电商客服的贴心快捷回复助手

作为一位电商客服&#xff0c;你是否曾在回复顾客的过程中感到困扰&#xff1f;是否因为经验不足而踩过雷&#xff0c;比如被平台提示用了违禁词&#xff0c;或是不清楚平台的响应率和满意度等问题&#xff1f;如果是这样&#xff0c;那么今天我要向大家介绍一款神奇的软件&…

小白学算法之移除元素(双指针法!)

力扣27&#xff1a;移除元素 题目内容&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-游戏存储(结束!)

文章目录 分数储存写在最后 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-飞船动画&#xff08…

制造知识普及(二)--企业内部物料编码(IPN)与制造商物料编码(MPN)

在日常的物料管理业务逻辑中&#xff0c;一物一码是物料管理的基本的业务规则&#xff0c;不管物料从产品开发还是仓库管理&#xff0c;甚至成本核算&#xff0c;都要遵循这个原则&#xff0c;才能保证产品数据的准确性&#xff0c;才具备唯一追溯的可行性。大部分企业都是这种…

OFD 发票解析

文章目录 参考文章1 了解ofd文件结构1.1 如何打开ofd 文件1.2 ofd文件结构1.3 提取信息思路 2. 提取发票信息实现2.1 目录结构2.2 实体类2.3 发票解析类2.4 controller2.5 service 参考文章 ofd发票解析 什么是ofd格式 ofd 格式是一种用于存储金融数据的开放格式&#xff0c;它…

SpringBoot3 配置Logback日志滚动文件

简介 本文介绍了在SpringBoot3中配置Logback日志滚动文件的方法&#xff0c;因为SpringBoot3内置的logback版本是1.4.14&#xff0c;之前使用SpringBoot2.1.5的logback配置发现有些东西不能生效了 环境 SpringBoot v3.3.2 内置的logback-core为1.4.14 正文 <configuration …

【预训练语言模型】 使用Transformers库进行BERT预训练

基于 HuggingFace的Transformer库&#xff0c;在Colab或Kaggle进行预训练。 鉴于算力限制&#xff0c;选用了较小的英文数据集wikitext-2 目的&#xff1a;跑通Mask语言模型的预训练流程 一、准备 1.1 安装依赖 !pip3 install --upgrade pip !pip install -U datasets !pi…

2024华数杯c题题解(一)

目录 原题背景 背景分析 问题一 思路 代码 问题二 思路 代码 原题背景 最近&#xff0c;“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实&#xff0c;越来越多外国游客来到中国&#xff0c;通过网络平台展示他们在华旅行的见闻…

如何利用virtuoso自动仿真占空比?

设计完一个振荡器&#xff08;OSC&#xff09;&#xff0c;我们有时候会仿真一下占空比&#xff0c;那么如何利用virtuoso软件的caculator功能自动获取呢&#xff1f; 开整&#xff01; 占空比是指在一个脉冲循环内&#xff0c;通电时间相对于总时间所占的比例。 我们在时钟上…

2023大数据-架构师案例(八)

Lambda架构 nginx &#xff08;b&#xff09; Hbase &#xff08;c&#xff09;Spark Streaming &#xff08;d&#xff09;Spark &#xff08;e&#xff09;MapReduce &#xff08;f&#xff09;ETL &#xff08;g&#xff09;MemSQL &#xff08;h&#xff09;HDFS &#x…

电机物理数学建模

电机定义 电机是以磁场为媒介&#xff0c;利用电磁感应作用进行能量转换与传递的电磁装置。机电能量转换装置&#xff0c;无论尺寸大小&#xff0c;从大型旋转电机如水轮发电机到小型机电信号变换器&#xff0c;虽然它们的用途和结构各异&#xff0c;但都基于相同的电磁场与运…