引言
三周前,我曾发表过一篇关于加密工具的吐槽文章,特别表达了对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。此外,它还使用标准工具如mount
、umount
和expect
。为减少用户需手动安装的依赖项,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:
|
|
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后,执行以下命令(逐条运行以便输入密码):
|
|
运行encfs --version
验证安装,输出应类似:
|
|
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_
最后可设置两个挂载相关选项:启动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”按钮浏览/打开。双击表格中已挂载卷触发相同操作。
常见问题解答
-
我的encfs文件夹密码安全吗?
我不确定。EncFSGui不保存密码,但会处理它,并在创建新文件夹时作为参数传递给expect脚本,挂载卷时也会将其传递给encfs。若认为不够安全,请手动使用encfs命令行工具挂载文件夹。 -
有时EncFSGui似乎无法卸载我的卷
由于EncFSGui是封装器,依赖umount和mount等工具。参考https://github.com/osxfuse/osxfuse/wiki/Mount-options(查看“kill_on_unmount”),存在已知情况导致卷仍挂载 despite umount命令。EncFSGui会显示正确的挂载状态(基于mount
输出)。 -
一些osxfuse挂载选项看起来有趣。你会实现它们吗?
可能会。 -
我认为你的C++很烂。GUI很烂。运行封装器的概念很烂。encfs很烂。我的生活很烂。你很烂。
很好。我猜你不想帮忙,对吧?
想帮忙吗?
若想帮忙,请访问GitHub仓库,其中包含设置开发环境的所有说明。请创建新分支(不要向master分支提交PR),且不要在PR中提交.dmg文件(即不要运行make release
)。