EncFSGui:macOS加密文件系统的图形化封装工具

EncFSGui是基于encfs和OSXFuse开发的macOS图形化加密工具,支持创建和管理加密文件夹,通过GUI简化命令行操作,提供密钥链集成和自动挂载功能,实现文件透明加密。

引言

三周前,我曾发表过一篇关于加密工具的吐槽文章,特别表达了对macOS平台缺乏用户友好的点击式加密文件工具的不满。我列出了个人对这类工具的功能和技术标准,并得出结论:行业对这些标准的看法似乎与我不同。事实上,过去唯一满足我所有标准的工具(BoxCryptor Classic)已不再支持当前OS版本,取而代之的是一款基于不同技术的工具,但移除了我认为值得付费的核心功能。

我在推特上多次提及这一困扰,但遗憾的是未获得任何解决方案。至少没有人指出我的标准列表毫无意义……但鉴于整体缺乏反馈,我不确定这意味着什么。

无论如何,由于我决定在2015年12月重新学习C++,我认为自己编写一个易于使用、功能齐全且兼容我常用系统(主要是OSX Yosemite和El Capitan)的工具会是个有趣的挑战。

今天,我正式推出EncFSGui项目。项目仓库位于https://github.com/corelan/EncFSGui,包含源代码、Makefile和编译后的二进制文件。该项目是开源的,但并非免费(至少对我而言不是。我花费了大量时间开发此应用,不得不在工作、家庭和其他娱乐活动之间做出取舍)。总之,天下没有免费的午餐。欢迎捐赠(我本可以在App Store上销售此应用……可能花费的精力相同)。

什么是EncFSGui?

EncFSGui是一款用C++编写的macOS应用程序,其GUI部分基于wxWidgets框架。EncFSGui依赖系统中已安装的特定二进制工具,并通过传递参数启动这些工具、捕获并处理输出。换句话说,它是一个封装器。它本身不实现加密或文件系统功能,而是依赖两个默认未预装在macOS上的工具:encfs和OSXFuse。此外,它还使用标准工具如mountumountexpect。为减少用户需手动安装的依赖项,EncFSGui静态链接了wxWidgets和libcurl。

对于不熟悉encfs和osxfuse的用户:

  • encfs是一个基于Fuse的免费加密文件系统。它是基于文件的,可透明地加密/解密单个文件。这意味着如果单个文件被修改,仅该文件会被更新。若加密文件夹同步至云端,只需更新更改的文件。它使用一个任意文件夹作为加密源文件夹,并通过osxfuse挂载为可用的明文版本。该明文版本的行为类似于系统上的卷,非常易于使用。安装encfs和osxfuse后,您可以:

    • 使用encfs创建新的加密文件夹
    • 通过挂载加密文件夹为明文卷来解密
    • 与明文版本交互,encfs在后台实时加密/解密
    • 无需访问解密版本时卸载明文卷
  • osxfuse是“用户空间文件系统”的macOS实现。它允许非特权用户创建自己的文件系统,并被encfs用于在解密版本中提供实际的文件系统功能。osxfuse是MacFUSE的继任者,后者已停止维护。更多信息请访问https://osxfuse.github.io/

由于EncFSGui不提供实际的加密或文件系统功能,您可以启动和关闭该工具,而不会影响加密文件夹的挂载状态。尽管封装器并非最硬核的开发方式(其功能依赖于所用工具的参数和输出),但相比BoxCryptor Classic和EncFSMP等工具,它有一个重要优势:您无需保持应用运行即可维持卷的挂载状态。至少,在某些情况下我发现这非常实用。

安装EncFSGui

在macOS系统上运行EncFSGui需完成4个步骤。我将尝试将其简化为一步,同时保留无需持续运行工具即可访问挂载文件夹的优势。目前,您需按以下步骤操作:

1. 安装Homebrew

我选择Homebrew作为包管理器。安装软件包前需先安装Homebrew本身。若已安装,可跳过此步骤(确保Homebrew为最新版本)。

使用Homebrew需安装gcc编译器。在较新的macOS版本中,尝试运行gcc时会提示安装Xcode命令行工具。若无提示,可通过App Store安装Xcode,然后手动安装命令行工具。

打开终端并运行gcc。若显示“clang: error: no input files”,则gcc已正确安装。若提示安装Xcode命令行工具,请按提示操作。若未安装gcc且无提示,需先安装Xcode,然后通过xcode-select --install安装命令行工具。

安装gcc后,执行以下命令安装Homebrew:

1
2
3
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
sudo chown -R $(whoami) /usr/local/lib
brew doctor

2. 安装osxfuse

安装osxfuse相对简单。访问https://sourceforge.net/projects/osxfuse/files/ 下载最新版本(本文撰写时最新2.x版本为2.8.3。使用3.x版本应无重大问题,但我未亲自测试)。下载.dmg镜像文件后,打开并双击“Install OSXFUSE 2.8.pkg”,按提示完成安装。

3. 安装encfs

安装Homebrew后,执行以下命令(逐条运行以便输入密码):

1
2
3
4
5
6
brew update
sudo chown -R $USER:admin /usr/local/include
sudo chown -R $USER:admin /usr/local/lib/pkgconfig
brew link xz libtool boost rlog
brew doctor
brew install homebrew/fuse/encfs

运行encfs --version验证安装,输出应类似:

1
encfs version 1.8.1

4. 安装EncFSGui

从https://github.com/corelan/EncFSGui/raw/master/release/EncFSGUI.dmg 下载最新镜像文件。打开.dmg文件后将“encfsgui.app”拖拽至“Applications”图标,等待复制完成即可。

打开Launchpad或应用程序列表应能看到EncFSGui应用。由于我未注册为Apple开发者,应用需获得权限才能运行。首次启动时可能显示警告。若信任预编译二进制文件(即不想自行编译源码),可进入“系统偏好设置”的“安全性与隐私”面板,在“通用”页面的“允许从以下位置下载的应用程序”部分找到encfsgui.app并点击“仍要打开”。确认后即可正常运行。

EncFSGui技术细节

EncFSGui是独立二进制文件,其配置存储在~/Library/Preferences下的“encfsgui Preferences”文件中。该文件由应用创建,内容为类似ini文件的纯文本结构。尽管易于阅读和修改,强烈建议勿手动更改此文件。

除永久配置文件外,EncFSGui可能创建临时文件Tcreateencfs.exp(位于/var/folders//<random>/T/),用于处理encfs交互。若expect脚本内容不正确(因encfs二进制文件输出与我的版本不同),可能导致应用挂起。这是使用封装器的缺点之一。但鉴于我本人使用EncFSGui并计划持续更新encfs,我会尽力发现并修复问题(也接受Pull Request)。

EncFSGui不支持包含引号或双引号的密码(不会从密码字段过滤这些字符,我将尝试解决此问题)。此外,卷名中也不允许使用空格、引号和双引号。EncFSGui会在保存新名称前移除这些字符。

启动时,EncFSGui监控mount命令输出以捕获已挂载的卷。若某卷与应用中配置的卷匹配,会标记为“已挂载”。运行时,EncFSGui在对象数组中记录所有配置卷的挂载状态。

尽管为Linux变体编译EncFSGui相对容易,但其中包含一些硬编码路径(如~/Library/Preferences~/Library/LaunchAgents的引用,以及encfs、mount和umount的默认路径)。可通过编辑设置覆盖这些路径。未来可通过加入系统检查以更通用方式确定路径。

最后,为允许EncFSGui在启动时运行(默认关闭的全局选项),会在~/Library/LaunchAgents下创建文件“org.corelan.encfsgui.LaunchAtLogin.plist”。仅当启用该选项时创建,禁用时删除。

使用EncFSGui

GUI

首次启动EncFSGui时,会看到GUI界面和任务栏图标。GUI初始仅显示4个激活按钮:“Create”“Open Existing”“Settings”和“Quit”。

底部状态栏显示配置的卷数量。右侧显示encfs特定信息。若EncFSGui未在默认路径/usr/local/bin/encfs找到encfs,除“Settings”和“Quit”外所有按钮将被禁用。可通过设置更改encfs路径。

点击任务栏图标弹出菜单包含以下项:

  • Launch EncFSGui
  • Mount/Unmount [Volume Name]
  • Settings
  • Quit

设置

当前版本设置选项包括:

  • 二进制路径:可设置重要二进制文件的绝对路径。未来可能保留encfs路径设置,但移除mount和umount路径(因其为标准二进制文件,可自动查找)。与当前无法设置expect路径的情况一致。
  • 启动与退出选项
    • 登录时启动encfsgui:用户特定设置,登录后自动启动应用。
    • 启动时显示任务栏图标:启动应用时隐藏GUI,仅显示任务栏图标。可通过任务栏菜单的“Launch EncFSGui”重新显示GUI。
    • 关闭应用时自动卸载卷:关闭应用时卸载所有已挂载卷。可基于每卷覆盖此设置(即保护特定卷不被卸载)。
    • 退出时不确认:效率至上者可选此选项跳过确认消息。
    • 启动时自动检查更新:当前默认禁用,未来版本可能默认启用。

点击“Cancel”忽略更改,“Apply”保存并关闭对话框。

创建新的encfs加密文件夹

创建新encfs文件夹需两个空文件夹:

  • 一个配置为encfs加密文件夹。
  • 另一个作为挂载点(即加密文件夹的明文版本挂载位置)。在此位置进行文件操作,切勿直接修改加密文件夹中的文件。

还需指定卷名(逻辑名称,但很重要):

  • 必须唯一
  • 挂载encfs文件夹时作为卷名使用

可修改未挂载卷的名称。名称中勿使用空格、引号或双引号。

除卷名和文件夹位置外,需选择EncFS配置文件。该配置决定加密强度及性能。我尝试平衡三个预设选项,若不同意我的选择,可使用“custom”配置文件自定义设置。注意这些设置后续不可更改。详细信息参考encfs手册。

首次使用“Create”功能时,EncFSGui会填充设备支持的文件名编码机制(常见如“Stream”“Block”“Null”,某些设备可能显示“Block32”)。若计划在多系统共享encfs文件夹(如通过Dropbox/SugarSync等云同步平台),请确保文件名编码机制在所有系统上受支持。

接下来需输入encfs加密文件夹的密码。该密码用于访问加密/解密密钥,因此后续可通过encfsctl工具更改密码而无需重新加密所有文件。我尚未实现密码修改功能,但未来会添加。可选择将密码存储到钥匙串中(使用login.keychain,存储为“EncFSGUI_”)。若通过encfsctl更改密码,可在EncFSGui中通过“Edit”功能更新钥匙串密码。

最后可设置两个挂载相关选项:启动EncFSGui时自动挂载卷(除非已挂载),以及关闭应用时防止自动卸载该卷(适用于设置了全局自动卸载选项但需针对特定卷例外的情况)。

点击“Apply”后,EncFSGui构建expect脚本并启动,传入密码参数。等待expect完成后检查加密文件夹是否创建.encfs6.xml文件(包含encfs配置)。切勿手动修改此文件,否则可能破坏功能。请备份此文件,丢失或损坏后将无法挂载encfs文件夹。

创建成功后,新encfs文件夹被添加到EncFSGui,但此时未挂载。选择表格中的行后,其他按钮(Browse、Remove、Info、Edit)变为可见。点击“Info”可查看对加密文件夹运行encfsctl的输出。

挂载和卸载文件夹

挂载encfs文件夹为明文卷:选择表格中对应行,点击“Mount & expose”按钮。若未配置钥匙串存储密码,会提示输入密码。EncFSGui构造encfs命令并传入密码尝试挂载。

挂载成功(通过mount命令输出确认)后,表格中“Mounted”列显示“YES”,行颜色变为红色。EncFSGui最多提示5次密码后放弃。无需添加更多“防暴力破解”保护,因encfs本身易被脚本化操作。

卸载卷:选择已挂载卷的行,点击“Unmount & lock”按钮。确保先关闭所有打开的文件以避免数据丢失。也可通过任务栏图标弹出菜单直接挂载/卸载卷。

如前所述,除非配置了关闭应用时自动卸载文件夹,否则关闭应用不会影响encfs文件夹的挂载状态。重新打开应用时会通过mount命令输出自动获取挂载状态。

添加现有encfs文件夹到EncFSGui

除创建新encfs文件夹外,可将现有文件夹(如BoxCryptor Classic文件夹)添加到EncFSGui。当前版本会检查指定文件夹是否包含.encfs6.xml文件以验证有效性(但文件存在不保证其有效)。

“Open Existing”对话框与“Create”对话框类似,但不含加密设置选项(因创建后不可更改)。其他选项相同。点击“Apply”不会改变挂载状态。

编辑卷

EncFSGui允许修改与encfs卷相关的设置(非encfs配置本身)。可修改内容取决于卷的当前挂载状态:

  • 已挂载卷:仅可更新钥匙串密码(若自行更改了底层encfs密码)。可移除或添加钥匙串密码,并可更改挂载选项。
  • 未挂载卷:还可修改卷名(需在EncFSGui中唯一)和挂载位置(即明文版本挂载路径)。

通过“Edit”按钮编辑文件夹。未挂载卷还可双击表格中的条目打开编辑对话框。

浏览卷

若不确定已挂载卷的位置,可通过“Browse”按钮浏览/打开。双击表格中已挂载卷触发相同操作。

常见问题解答

  1. 我的encfs文件夹密码安全吗?
    我不确定。EncFSGui不保存密码,但会处理它,并在创建新文件夹时作为参数传递给expect脚本,挂载卷时也会将其传递给encfs。若认为不够安全,请手动使用encfs命令行工具挂载文件夹。

  2. 有时EncFSGui似乎无法卸载我的卷
    由于EncFSGui是封装器,依赖umount和mount等工具。参考https://github.com/osxfuse/osxfuse/wiki/Mount-options(查看“kill_on_unmount”),存在已知情况导致卷仍挂载 despite umount命令。EncFSGui会显示正确的挂载状态(基于mount输出)。

  3. 一些osxfuse挂载选项看起来有趣。你会实现它们吗?
    可能会。

  4. 我认为你的C++很烂。GUI很烂。运行封装器的概念很烂。encfs很烂。我的生活很烂。你很烂。
    很好。我猜你不想帮忙,对吧?

想帮忙吗?

若想帮忙,请访问GitHub仓库,其中包含设置开发环境的所有说明。请创建新分支(不要向master分支提交PR),且不要在PR中提交.dmg文件(即不要运行make release)。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计