惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

程序员笔记(huoyijie.cn)

generate new dataset with llm and knowledge graph resume deepseek applications Implement the classic huarongdao game with react Implement the classic tetris game with react Writing admin dashboard template with Nextjs How to AuthN user with OpenLDAP share whiteboard with websocket ocr overview tech notes subscribe topic with sse multi devices github an algorithm used for image text detect an algorithm used for image text detect facial expression recognition technology based on neural network oauth2 mysql store a real time collaborative whiteboard with infinite space How to perform load testing with Grafana k6 fix split of undefined with gitbook theme nodejs http proxy middleware analyze referer of express website writing a CDN origin server with Django a personal lightweight CMS tool writing in Golang profile introduce the post processing introduce the text detect method blockchain for dummies medical applications on ai facial expression recognition study facial expression recognition auth auth with oauth2 auth with jwt chat with sse react chat with websocket react http message signatures infinite whiteboard with socket.io multi factor auth with totp subscribe topic with sse capture screen to gif Golang 经典入门实践教程 · GitBook 弈杰围棋智能终端 · GitBook 如何把手机触摸屏变成触控板(Touchpad) · GitBook 基于 SOCKET.IO 搭建个人电脑 HTTP 静态服务器代理 · GitBook 三百行代码搭建一个简单的 SOCKS5 代理服务器 · GitBook 微信小程序(蓝牙BLE)远程遥控树莓派小车 · GitBook 语音远程遥控树莓派小车 · GitBook 树莓派的一些使用经验 · GitBook 从零开始制作树莓派小车 · GitBook UDPack 2.0 协议 · GitBook 前言 · GitBook 升级 Ubuntu 到 20.04 LTS 长期维护版本 · GitBook 反向代理服务器实现原理 · GitBook 网站支持 HTTP 2.0 · GitBook 搭建配置邮件服务器 · GitBook 使用 Git 与 Gitbook 创建管理电子书 · GitBook 网站图片视频接入CDN · GitBook a personal lightweight self hosted git server written in Golang 快速搭建CDN回源服务器 · GitBook 基于 Git 搭建代码托管服务器 · GitBook
EFS 加密文件系统 · GitBook
huoyijie · 2024-05-24 · via 程序员笔记(huoyijie.cn)

进入 EFS 网站

进入 EFS 网站

系统介绍

EFS (Encrypting File System) 是基于网络通信、加密、FUSE 等技术采用 golang 语言实现的网络加密文件系统,文件数据加密存储于远程服务器上面,一方面可以确保数据的隐私安全,只有数据所有者拥有密钥和密码,另一方面也可以用来对重要数据做远程备份。

EFS 由客户端、服务端软件组成,客户端程序支持 Windows/Mac/Linux 系统,运行在用户电脑上,服务端软件运行在远程服务器上。用户只需在电脑上安装好客户端,注册帐号并生成密钥,就可以正常使用 EFS 客户端了,运行 EFS 客户端后,电脑上相当于挂载了一个“远程”移动硬盘,使用起来非常简单。

EFS 客户端基于 FUSE (Filesystem in Userspace) 实现,在不同的平台上依赖不同的系统组件。文档的后面部分也会介绍如何安装系统依赖和客户端软件。

如何安装

用户需要在电脑上安装客户端软件 efscli 及其依赖组件。其中 efscli 是预编译的二进制可执行文件,下载后修改权限可直接运行。

Windows

Mac

Linux

常见的 Linux 发行版在内核中都内置 FUSE 支持,所以不需要安装额外的依赖组件。

如何使用

  • 点击 注册帐号

    注册暂时不需设置登录密码,通过邮件接收验证码后自动登录,后续如果登录状态失效后,可再通过邮件验证码进行登录。

  • 点击 申请代码

    此处申请的代码,在后面生成客户端密钥时会用到,通过这个代码可以把客户端密钥关联到登录帐号,所以该代码需要妥善保管,确保不要泄漏给他人。如果代码已经使用过,则会立刻失效,不能够再生成新的密钥。

  • 运行 efscli 客户端软件

    在上一节安装环节,已经下载了相应平台的客户端程序,Mac/Linux 平台需要设置可执行权限

      # Mac
      # 设置可执行权限
      $ chmod a+x ./efscli-darwin-amd64
    
      # 运行 efscli 客户端
      $ ./efscli-darwin-amd64
    

    或者

      # Linux
      # 设置可执行权限
      $ chmod a+x ./efscli-linux-amd64
    
      # 运行 efscli 客户端
      $ ./efscli-linux-amd64
    

    Windows 可以在命令行中运行,也可以双击 efscli-0.5.0-windows-amd64.exe 文件直接运行。

  • 首次运行,生成密钥文件

    首次运行需要生成本地密钥文件,此时需要输入网站上申请的代码,并设置用来保护密钥文件的密码,该密码会用来对密钥文件本身内容进行加密。生成密钥文件后,会自动登录 EFS 系统。

  • 生成密钥后,再次运行

    此时只需要输入刚刚设置的密码,对密钥文件进行解密,然后会自动登录 EFS 系统。

  • 登录 EFS 系统

    类似插入移动硬盘到电脑,系统中会自动挂载,Mac/Linux 会把虚拟文件系统空间挂载在 ~/efscloud 目录下,Windows 会出现一个新的盘符,如 Z:\。此时,就可以想使用移动硬盘一样,正常读写 EFS 文件系统。

  • 修改昵称

    点击右上角帐号昵称,显示下拉菜单,进入帐号信息页面,可以修改帐号昵称。

  • 设置密钥标签

    存在多个密钥的情况下,通过给密钥设置标签,客户端登录时,可以明确读取的是哪个密钥。点击右上角帐号昵称,显示下拉菜单,进入管理密钥页面,可以设置密钥标签。

安全隐私

  • 通信安全

    efscli 客户端与服务端软件会建立 TLS 安全连接,并进行通信,因此通信过程中所有数据会被加密保护。

  • 数据加密

    文件系统中主要的敏感数据为目录名称、文件名称、文件内容,在 efscli 客户端中,这些敏感数据会被加密,然后发送到服务器端,数据以加密的形式存储在服务器上。

    efscli 客户端从服务端读取数据时,读取到的数据是密文,也会对数据进行自动解密,然后再把解密后的数据返回给操作系统。

    从用户的角度看,存放在 EFS 中的目录和文件与正常使用的磁盘或者移动硬盘没有任何区别,但是其数据却是加密存储的。

  • 密钥安全

    首次生成密钥,需要输入代码,为了正常生成密钥,请确保不要以任何方式泄漏给任何人。当使用该代码生成密钥文件后,此代码就立刻失效了。

    生成的密钥文件,密钥内容本身是会通过一个密码进行加密的,因此虽然密钥文件存储在用户的电脑上,即使其他人通过一定手段拿到密钥文件,没有密码,也是无法读取 EFS 文件系统数据的。

    但是,请保护好密钥文件,不要以任何方式泄漏给任何人。为了确保密钥文件不丢失,最好对该密钥文件做好备份工作,比如保存到自己的其他工作电脑或者其他移动硬盘中,但是请确保这些设备都是安全的。备份密钥文件的意义在于,如果用户电脑硬盘损坏,或者意外删除密钥文件,还可以通过备份文件恢复。

    密钥文件不会以任何形式,任何方式发送到服务器端,遵循零信任原则,efscli 客户端不相信服务端程序,不会把密钥文件上传到服务器,即使密钥本身也是加密的。

    只有用户设置的密码,才可以正常读取密钥文件。

  • 密码安全

    生成密钥文件时,用户设置了密码,这个密码及这个密码的任何变体(如 Hash)不会被发往服务器端。

    efscli 客户端软件也不会存储该密码明文,仅仅把密码的 bcrypt Hash 变体存储在了密钥文件中,而这是安全的,因为 Hash 算法是不可逆的,不可能通过 Hash 值得到原始密码。efscli 客户端存储密码的 bcrypt Hash 变体的原因是用来进行密码认证,确保用户输入了正确的密码。

    运行 efscli 客户端软件时,当且仅当用户输入了正确的密码,才能够正常读取密钥文件内容,进而登录 EFS 系统,读写 EFS 文件系统数据。

    用户需要确保不以任何方式把密码泄漏给任何人,应该仅把密码记在大脑中。这样做的好处是,只有用户本身知道密码,进而使用密钥文件,进而登录 EFS 系统读写数据。

    EFS 网站 登录帐号不设置密码的原因在于,避免用户把登录帐号密码和保护密钥文件的密码设置为相同的密码,避免在用户不知情的情况下,意外泄漏密码。

  • 隐私安全

    用户在不以任何形式泄漏密码和密钥文件的情况下,也就拥有了确保隐私安全的存储在远程服务器上的“移动硬盘”,可以把相对隐私的数据存储在 EFS 文件系统里面。

技术实现

  • efscli 客户端架构图

    efscli 客户端

  • privkey 密钥文件

    privkey 密钥文件

字段 说明
KeyId 密钥ID
AccId 帐号ID
Email 登录帐号
PassHashAndBcrypt bcrypt(sha256(密码明文), 14)
EcdsaPublicKey 签名验证公钥
EcdsaPrivateKey aes.Encrypt(签名验证私钥, sha256(密码明文))
RsaPublicKey 非对称加密公钥
RsaPrivateKey aes.Encrypt(非对称加密私钥, sha256(密码明文))
AesPrivateKey rsa.Encrypt(对称加密密钥, RsaPublicKey)

密码明文: 是生成密钥过程中,用户的输入密码。PassHashAndBcrypt 是密码明文先经过 sha256 哈希,再经过 bcrypt 哈希得到。是用来进行密码验证的,在 efscli 客户端软件内校验用户输入密码是否正确。也就是说密码明文及密码的任何变体都不会上传至服务器。

生成密钥文件的过程中,efscli 客户端软件会随机生成 3 个密钥,分别是 ecdsa 公私钥、rsa 公私钥和 aes 密钥。

ecdsa 密钥是用来进行进行客户端认证的,首次连接服务器生成密钥时,ecdsa 公钥会上传到服务器端,后续连接服务器的登录请求参数必须经过签名,并由服务端进行签名验证。

rsa 密钥是用来加密客户端敏感数据的,目前主要用来加密 aes 密钥。未来可能会出现其他类型敏感数据,也会通过 rsa 密钥加密。

aes 密钥是用来对文件系统数据进行加密的,包括目录名称、文件名称以及文件数据本身。

其中敏感数据 EcdsaPrivateKeyRsaPrivateKeyAesPrivateKey 都是加密存储的。

KeyId 是生成的密钥文件的全局唯一标识,由服务端进行分配。

AccIdEmail 是密钥文件关联的帐号信息,生成密钥时会要求用户输入代码,代码是必须登录网站后,通过申请代码得到。

  • 首次登录EFS系统

    首次登录EFS系统

  • 非首次登录EFS系统

    非首次登录EFS系统

  • File Transfer Protocol

    ftp协议运行于 TLS 安全连接之上,ftp客户端与服务端通过rpc进行请求与应答,请求/应答通过protobuf进行序列化与反序列化。在EFS系统里,文件是被分成4KB大小的块的集合来读或者写的。

    文件块

    如上图,是一个410KB文件的块划分,如果是写文件,ftp协议会在客户端内部将数据块进行加密,然后再传输至服务端进行存储。如果是读文件,客户端从服务器端直接读取的是加密块,ftp协议会自动进行解密,然后返回原始数据。

    可以看到,ftp协议会自动完成数据的加解密,这个过程是在 efscli 客户端软件内部完成的,服务端全程没有参与,服务端读写的文件块数据都是加密的。

    明确的说,ftp协议是对目录名称、文件名称以及文件块数据自动进行加密。采用 aes 密钥对数据进行对称加密。而前面已经论述过,aes 密钥加密存储于密钥文件中,必须有密码才能够解密。

  • FUSE (Filesystem in Userspace)

    FUSE

特别说明

目前 EFS 文件系统处于 Beta 测试阶段,为了确保文件数据不丢失,请确保存储在 EFS 中的文件数据在其他设备中有备份。目前每个帐号只能申请一个代码,每个代码可以用来生成一个密钥文件,每个密钥文件对应 4GB 云存储空间。

如果你对该项目感兴趣,或者有任何疑问,可以随时联系作者 yijie.huo@foxmail.com

Github

huoyijie