EncFSGui:macOS上的加密文件系统GUI封装工具

EncFSGui是一个基于encfs和OSXFuse的macOS GUI封装工具,用于创建和管理加密文件夹。支持自动挂载、密码管理和配置文件编辑,适用于需要文件级加密的用户。

EncFSGui – GUI Wrapper around encfs for OSX

引言

三周前,我发表了一篇关于加密工具的抱怨/担忧,特别是针对macOS上缺乏点即用、用户友好的基于加密的文件保护工具。我列出了个人功能和技术标准,并得出结论:行业似乎对这些标准有不同的看法。事实上,过去唯一满足我所有标准的工具(BoxCryptor Classic)不再支持当前操作系统版本,并被基于不同技术的工具取代,移除了我认为足够重要以证明付费购买应用的大部分功能。

我多次在推特上提到我的抱怨,但不幸的是,我没有收到任何解决方案。至少,没有人指出我的标准列表毫无意义……但鉴于整体缺乏反馈,我不确定这是否意味着什么。

无论如何,由于我决定在2015年12月重新开始学习C++,我认为自己编写一些东西会是一个有趣的挑战,它应该易于使用、实现所需功能,并在我使用的系统上工作(主要是macOS Yosemite和El Capitan)。

今天,我准备介绍EncFSGui项目。你可以在https://github.com/corelan/EncFSGui找到项目仓库。仓库包含源代码、Makefile和编译后的二进制文件。它是开源的,但不是免费的。(至少,对我来说不是免费的。我花了相当多的时间编写这个应用,这要求我在工作、家庭和其他有趣的事情之间做出选择。)总之,没有免费的午餐。捐赠总是受欢迎的。(我本可以在App Store上出售这个应用……可能对我来说工作量相同。)

它是什么?

EncFSGui是一个用C++编写的macOS应用。它依赖wxWidgets框架来实现GUI方面。EncFSGui依赖系统上某些二进制文件/工具的存在,并简单地启动这些工具并传递必要的参数,捕获和处理输出。换句话说,它是一个封装器。它本身不实现加密,也不实现文件系统的创建,而是依赖两个默认不在macOS上的工具:encfs和OSXFuse。此外,它使用标准工具如’mount’、‘umount’和’expect’。为了限制你需要自己安装的依赖项数量,EncFSGui静态链接了wxWidgets和libcurl。

对于那些不熟悉encfs和osxfuse的人: encfs是一个基于Fuse的免费加密文件系统。它是基于文件的,这意味着它会透明地加密/解密单个文件。换句话说,如果对单个文件进行了更改,只有该文件会被更改。如果这个encfs加密文件夹同步到云端,只有更改的文件需要更新。它使用一个任意配置为“encfs”加密源文件夹的文件夹,并使用osxfuse将其挂载为一个你可以使用的明文版本。这个明文版本的行为就像系统上的一个卷,使其非常易于使用。当encfs和osxfuse安装后,你可以:

  • 使用“encfs”创建一个新的encfs加密文件夹
  • 通过将其挂载为明文卷来解密encfs加密文件夹
  • 与明文版本交互,允许encfs在后台实时加密/解密
  • 当你不再需要访问解密/明文版本时,卸载明文卷

osxfuse是“用户空间文件系统”的macOS实现。它允许非特权用户创建自己的文件系统,并被encfs用来在encfs加密文件夹的解密版本中提供实际的文件系统。osxfuse是MacFUSE的继任者,后者不再维护。你可以在https://osxfuse.github.io/找到更多关于osxfuse的信息。

由于EncFSGui不提供实际的加密或文件系统功能,你可以启动和停止该工具,而不会改变加密文件夹的挂载状态。尽管我同意封装器不是构建事物最令人兴奋的硬核方式(因为它的功能依赖于它使用的工具的参数和输出),但它比BoxCryptor Classic和EncFSMP等工具有一个重要优势,因为你不需要保持应用运行来保持卷挂载。至少,我发现这在某些情况下非常有用。

安装EncFSGui

在macOS系统上运行EncFSGui是一个四步过程。我会尝试找到一种方法将其变为一步过程,而不失去不必保持工具运行即可访问挂载的encfs文件夹的优势。无论如何,目前你需要运行下面列出的四个步骤。

记录一下,我只在macOS Yosemite和El Capitan上尝试了这些步骤。我不知道在旧版本的macOS上程序是否会有所不同。

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镜像文件)。打开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是否工作,运行’encfs –version’。你应该得到类似这样的输出:

1
2
corelanc0d3r@~: # encfs --version
encfs version 1.8.1

4. 安装EncFSGui

要获取EncFSGui的最新副本,从https://github.com/corelan/EncFSGui/raw/master/release/EncFSGUI.dmg下载镜像文件。

打开dmg文件,简单地将“encfsgui.app”图标拖到“Applications”图标上。这会将.app包复制到你的本地/Applications文件夹。等待复制完成,你就全部设置好了。

如果你打开Launchpad(或查看已安装应用列表),你应该看到EncFSGui应用。

由于我不是注册的Apple开发者,应用需要你的权限才能运行。当尝试启动EncFSGui时,你(很可能)会收到一个看起来像这样的警告:

如果你决定信任我预编译的二进制文件(即,如果你不想自己编译源代码),并想覆盖限制,启动“系统偏好设置”实用程序并打开“安全与隐私”面板。

在“通用”窗格中,你会看到一个名为“允许从以下位置下载的应用”的部分。在该部分中,你应该看到一个对encfsgui.app的引用,以及一个“无论如何打开”按钮。

点击按钮。你会得到另一个要求确认的对话框。

点击“打开”。就这样。从这时起,你将能够运行这个应用而无需提示或警告。请记住每次更新EncFSGui应用时都要这样做。

注意:如果你不信任我的二进制文件,请务必查看github仓库页面。它包含了如何设置开发环境的所有详细步骤。我甚至提供了Makefile,所以你可以自己编译源代码。可重现构建FTW。

EncFSGui技术细节

EncFSGui是一个独立的二进制文件。它将配置存储在~/Library/Preferences中,一个名为“encfsgui Preferences”的文件中。这个文件由应用创建,并包含一个类似纯文本“ini文件”的结构。尽管很容易读取和操作这个文件,但强烈建议永远不要自己更改这个文件。

除了这个永久配置文件外,EncFSGui可能会创建一个名为Tcreateencfs.exp的临时文件(存储在/var/folders//下)。这个文件包含一个expect脚本,用于自动化encfs二进制文件的初始设置。该文件在创建新encfs文件夹时创建,并在完成后删除。

如果expect脚本不包含正确的内容(因为你的encfs二进制文件在输出(问题等)方面与我的不同),可能会导致应用挂起。这是反对使用封装器的论点之一。另一方面,由于我自己在使用EncFSGui(并且我计划尽可能保持encfs更新),我可能会自己发现问题并尝试修复它们。(是的,我也接受拉取请求。)

EncFSGui不喜欢带有引号或双引号的密码。(它不会从密码字段中过滤它们,我会尝试找到解决方案。)此外,EncFSGui也会拒绝卷名中的空格、引号和双引号。事实上,EncFSGui会在保存新名称之前从卷名字段中删除这些字符。

启动时,EncFSGui会监控’mount’命令的输出以捕获已挂载的卷。如果其中一个卷与应用中配置的卷匹配,它会将它们标记为“已挂载”。运行时,EncFSGui在一个对象数组中记住所有配置卷的挂载状态。

尽管为Linux变体编译EncFSGui相当容易,但它确实包含一些硬编码路径(如对~/Library/Preferences和~/Library/LaunchAgents的引用),以及encfs、mount和umount二进制文件的默认路径(可以通过编辑设置覆盖)。无论如何,更新源代码并构建操作系统检查以更通用地确定位置应该是可行的。

最后,为了允许EncFSGui在启动时启动(这是一个默认禁用的全局选项),一个名为“org.corelan.encfsgui.LaunchAtLogin.plist”的文件将在~/Library/LaunchAgents下创建。这只在你启用选项时发生。当你再次禁用选项时,文件将被删除。

使用EncFSGui

GUI

首次启动EncFSGui时,你会看到两件事:GUI本身和一个任务栏图标。GUI会显得相当空,只有4个按钮激活:“创建”、“打开现有”、“设置”和“退出”。

在窗口底部的状态栏中,你会看到在EncFSGui中配置的卷数。在右侧,你会得到encfs特定信息。如果EncFSGUI无法找到encfs作为/usr/local/bin/encfs(这是应用中的默认值),所有GUI按钮将被禁用,除了“设置”和“退出”。你可以通过设置更改encfs路径。

当你点击任务栏图标时,你会得到一个包含以下项目的弹出菜单:

设置

让我们先看看设置。在撰写本文时,当前版本包含以下选项:

这些选项大多数是不言自明的。你基本上可以设置/更改一些重要二进制文件的绝对路径。老实说,我可能会保留encfs的那个,但删除mount和umount的那些,因为那些是标准二进制文件(我可以告诉EncFSGui自己找到它们)。这将与目前无法设置“expect”二进制文件完整路径的事实一致。无论如何,这个区域的事情很快就会更新。

接下来,你可以设置一些启动和退出选项:

  • 登录时启动encfsgui:这是一个用户特定的设置,会在你登录时启动encfsgui。
  • 启动encfsgui作为任务栏图标:这允许你在启动应用时隐藏GUI(只在任务栏显示一个图标)。你可以使用任务栏图标弹出菜单中的“启动EncFSGui”菜单项再次使GUI可见。
  • 关闭应用时自动卸载卷:这允许你在关闭应用时卸载所有挂载的卷。可能值得提的是,你可以按卷覆盖此设置。(换句话说,你可以卸载所有卷,除了那些“受保护”的卷)。
  • 退出时不要求确认:如果你是一个效率狂热者,不喜欢关闭应用时的额外“你确定吗”消息,那么这个选项就是你需要的。
  • 启动时自动检查更新:尽管此时默认禁用,我可能会在未来的版本中默认启用此选项。(一旦大量更改减少一点)

点击“取消”将忽略你做出的任何更改。点击“应用”将保存更改并关闭对话框。

这带我们到应用的主要目的:管理加密文件夹。

创建一个新的encfs加密文件夹

创建一个新的encfs文件夹涉及两个空文件夹:

  • 一个将被配置为encfs加密文件夹。
  • 另一个将被用作挂载点(即加密文件夹的明文/解密版本将被挂载的位置)。这也是你必须与之交互的位置(打开文件、保存文件等)。永远不要直接在加密的encfs文件夹中更改任何文件或文件夹!!

此外,你需要指定一个“卷”名。这只是一个逻辑名称,但它是一个相当重要的名称:

  • 它必须是唯一的
  • 当你请求挂载encfs文件夹时,它将用作卷的名称

幸运的是,你可以更改这个卷的名称(只要它没有挂载)。不要在这个名称中使用空格、引号或双引号。保持简单和相关。

除了指定卷名和两个文件夹位置外,你必须选择一个EncFS配置文件。这个配置文件决定了将用于此文件夹的加密强度,从而也决定了性能。我尝试围绕三个预设做出平衡的决定,但如果你不同意我的选择,你总是可以使用“自定义”配置文件来设置自己的偏好。请记住,你之后不能更改这些设置。你可以在encfs手册页中找到关于其中一些设置(及其对安全性与性能的影响)的更多细节。

第一次打开“创建”功能时,EncFSGui会为你的设备填充支持的文件名编码机制。最常见的是“Stream”、“Block”和“Null”。在一些设备上,你可能也会看到“Block32”。如果你计划在多个系统上共享encfs文件夹(例如通过Dropbox/SugarSync或其他云同步平台),请确保检查文件名编码机制是否在所有系统上都支持。

接下来,你需要为encfs加密文件夹输入一个密码。这个密码用于访问用于加密/解密encfs文件夹的密钥。换句话说,你以后可以更改密码(使用’encfsctl’工具),而无需解密和重新加密所有文件。我还没有实现更改encfs文件夹密码的能力,但我会。正如你在上面的截图中所看到的,你可以选择将密码存储到钥匙串中。EncFSGui使用login.keychain来这样做,并将密码存储在“EncFSGUI_”下。如果你用encfsctl更改了encfs文件夹的密码,你可以使用EncFSGui中的“编辑”功能更新钥匙串中的密码。

最后,你可以设置两个挂载相关选项。你可以告诉EncFSGui在EncFSGui启动时自动挂载卷(除非卷已经挂载)。你也可以防止这个卷在关闭应用时自动卸载。如果你设置了全局选项在关闭应用时自动卸载卷,并且你想为这个特定卷覆盖该设置,这可能会有帮助。

当你点击“应用”时,EncFSGui将构建一个“expect”脚本并启动该脚本,将密码作为参数传递给它。它将等待“expect”完成,并检查是否在encfs加密文件夹中创建了一个名为.encfs6.xml的文件。这个文件包含该文件夹的encfs配置。永远不要自己更改这个文件,因为你很可能会破坏东西。请确保在某处保留一个副本,因为如果文件丢失或损坏,你将无法再挂载encfs文件夹。

如果一切顺利,新的encfs文件夹被创建,并添加到EncFSGui中。此时它不会被挂载。

如果你在表中选择一行,其他一些按钮将变得可见:浏览、删除、信息和编辑。

如果你点击“信息”,你可以看到对加密文件夹运行“encfsctl”的输出:

挂载和卸载文件夹

要将encfs文件夹挂载为明文卷,只需在表中选择相应的行,并点击“挂载和暴露”按钮。除非你配置了EncFSGui将密码存储在钥匙串中,否则你会被提示输入密码。EncFSGui然后将构建一个encfs命令,传递密码,尝试挂载选定的文件夹。

当卷挂载时(通过检查“mount”命令的输出确认),表将指示文件夹已挂载。“已挂载”列将指示“是”,行的颜色将变为红色而不是蓝色。

EncFSGui在放弃之前会提示密码最多5次。没有理由添加更多“暴力”保护,因为通过encfs也可以轻松编写脚本。如果没有栅栏,为什么要关上门。

要卸载,只需选择一个已挂载卷的行,并使用“卸载和锁定”按钮。确保先关闭任何打开的文件,以避免数据丢失。

注意:你可以直接从任务栏图标弹出菜单挂载和卸载卷。

再次,如解释,除非你配置了EncFSGui在关闭应用时自动卸载文件夹,关闭应用不会对你的encfs文件夹的挂载状态产生任何影响。如果你再次打开应用,它应该通过查看“mount”命令的输出自动获取挂载状态。

将已存在的encfs文件夹添加到EncFSGui

除了创建一个全新的encfs文件夹外,你还可以将已存在的encfs文件夹添加到EncFSGui。例如,这将允许你用EncFSGui打开BoxCryptor Classic文件夹。EncFSGui的当前版本将检查指定的encfs文件夹是否包含.encfs6.xml文件,以确定这是否是一个有效的encfs文件夹,然后将其添加到EncFSGui中。(当然,文件的存在并不保证文件有效)。

“打开现有”对话框看起来像这样:

如你所见,它看起来与“创建一个新的encfs文件夹”对话框非常相似,除了设置加密设置的能力。毕竟,在encfs文件夹创建后,我们不能更改任何这些设置。其他选项应该是不言自明的(因为它们与“创建一个新的encfs文件夹”对话框中的相同)。

点击“应用”不会对挂载状态产生任何改变。

编辑卷

EncFSGui允许你更改与encfs卷相关的一些设置(但不是与encfs配置本身)。更改某些内容的能力由编辑时卷的挂载状态定义。

对于已挂载的卷,你只能更新钥匙串密码(以防你自己更改了底层encfs密码)。如果设置了钥匙串密码,你可以删除它,或者如果尚未设置,可以将密码添加到钥匙串。此外,你可以更改挂载选项。

对于未挂载的卷,你还可以更改卷名(但它在EncFSGui中必须是唯一的),并更改挂载位置(即encfs加密文件夹的明文版本将被挂载的位置)。

你可以通过“编辑”按钮编辑文件夹。对于未挂载的卷,你也可以双击表中的条目,这将显示“编辑”对话框。

浏览卷

如果你不知道在哪里查找挂载的(明文)卷,你可以通过“浏览”按钮浏览/打开它。双击表中已挂载的卷将触发相同的事情。

常见问题解答

  1. 我的encfs文件夹的密码安全吗? 嗯,我不知道。EncFSGui不保存密码,但它处理密码,并在你创建新encfs文件夹时将其作为参数传递给“expect”脚本,并在挂载卷时将其回显给encfs
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计