为OSX开发的EncFS加密文件系统GUI封装工具

EncFSGui是一个基于C++和wxWidgets开发的OSX应用程序,作为encfs和OSXFuse的命令行工具的GUI封装。它允许用户通过图形界面创建、管理和访问加密的虚拟文件系统,无需在后台保持应用运行即可维持卷挂载状态。

EncFSGui – GUI Wrapper around encfs for OSX

引言

三周前,我发表了一篇关于加密工具的抱怨/关切,特别是针对OSX系统上缺乏以点击即用的友好方式实现基于加密的文件保护工具。我列出了我个人对此类工具的功能和技术标准,并得出结论,业界似乎对这些标准有不同的看法。事实上,过去唯一满足我所有标准的工具(BoxCryptor Classic)已不再支持当前OS版本,并被一款基于不同技术的工具所取代,移除了我认为足够重要、足以证明当初付费购买其应用价值的多数功能。

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

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

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

这是什么?

EncFSGui是一个用C++编写的OSX应用程序。它依赖wxWidgets框架来实现其GUI方面。EncFSGui依赖于系统上存在的某些二进制文件/工具,并简单地启动这些工具并附带必要的参数,捕获并处理输出。换句话说,它是一个包装器。它本身不实现加密,也不实现文件系统的创建,而是仅仅依赖于两个在OSX上默认不存在的工具:encfs和OSXFuse。此外,它还使用标准工具,如 mountumountexpect。为了限制您需要自己安装的依赖项数量,EncFSGui与wxWidgets和libcurl进行了静态链接。

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

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

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

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

安装EncFSGui

让EncFSGui在您的OSX系统上运行是一个4步过程。我将尝试找到一种方法将其变为一步过程,同时不放弃不必保持工具运行即可访问已挂载encfs文件夹的优势。无论如何,目前,您需要运行下面列出的4个步骤。

作为记录,我只在OSX Yosemite和El Capitan上尝试过这些步骤。我不知道在旧版本的OSX上过程是否/会有所不同。

1. 安装homebrew

我决定使用Homebrew作为包管理器。在安装包之前,您必须先安装Homebrew本身。如果您已经安装了,可以跳过此步骤。(只需确保homebrew是最新的)。

为了能够使用Homebrew并安装软件包,您需要gcc编译器。在较新版本的OSX上,当您尝试运行 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,因此您可以自己编译源代码。可重现构建万岁。

EncFSGui技术细节

EncFSGui是一个独立的二进制文件。它将其配置存储在 ~/Library/Preferences 中,一个名为“encfsgui Preferences”的文件中。此文件由应用程序创建,并包含一个纯文本的“ini文件”样式的结构。尽管该文件非常易于阅读和操作,但强烈建议您永远不要自己更改此文件。

除了这个永久性配置文件之外,EncFSGui可能会创建一个名为 Tcreateencfs.exp 的临时文件(存储在 /var/folders/ 下)。这是一个 expect 脚本,用于自动执行新的 encfs 文件夹的创建过程。Expect 脚本将由 encfs 进程使用。一旦文件夹创建完成,该文件将被删除。

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

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

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

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

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

使用EncFSGui

GUI

首次启动 EncFSGui 时,您会看到两样东西:GUI 本身和一个任务栏图标。GUI 看起来相当空,只有 4 个按钮处于活动状态:“Create”、“Open Existing”、“Settings”和“Quit”。

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

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

设置

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

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

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

  • Start encfsgui at login: 这是一个用户特定的设置,会导致您登录时立即启动 encfsgui。
  • Start encfsgui as icon in taskbar: 这允许您在启动应用程序时隐藏 GUI(仅在任务栏中显示图标)。您可以使用任务栏图标弹出菜单中的“Launch EncFSGui”菜单项再次使 GUI 可见。
  • Auto unmount volumes when closing app: 这允许您在关闭应用程序时卸载所有已挂载的卷。可能值得一提的是,您可以基于每个卷覆盖此设置。(换句话说,您可以卸载所有卷,“受保护”的卷除外)。
  • Do not ask for confirmation on exit: 如果您是效率狂热者,不喜欢关闭应用程序时额外的“您确定吗”消息,那么这个选项就是您需要的。
  • Automatically check for updates at startup: 虽然此时默认仍为禁用,但我可能会在未来的版本中默认启用此选项。(一旦大量更改减少一些)

点击“Cancel”将忽略您所做的任何更改。点击“Apply”将保存更改并关闭对话框。

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

创建新的encfs加密文件夹

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

  1. 一个将被配置为encfs加密文件夹的文件夹。
  2. 另一个将用作挂载点的文件夹(即加密文件夹的明文/解密版本将被挂载的位置)。这也是您必须与之交互的位置(打开文件、保存文件等)。切勿直接对加密的encfs文件夹中的任何文件或文件夹进行更改!!

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

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

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

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

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

接下来,您需要为encfs加密文件夹输入密码。此密码用于访问用于加密/解密encfs文件夹的密钥。换句话说,您稍后可以更改密码(使用 encfsctl 工具),而无需解密和重新加密所有文件。我尚未实现更改encfs文件夹密码的功能,但我会的。正如您在上面的屏幕截图中所见,您可以选择将密码存储到钥匙串中。EncFSGui使用login.keychain来执行此操作,并将密码存储在“EncFSGUI_”下。如果您使用encfsctl更改了encfs文件夹的密码,可以使用EncFSGui中的“编辑”功能更新钥匙串中的密码。

最后,您可以设置2个与挂载相关的选项。您可以告诉EncFSGui在EncFSGui启动时自动挂载卷(除非卷已挂载)。您还可以防止此卷在您关闭应用程序时自动卸载。如果您设置了在关闭应用程序时自动卸载卷的全局选项,并且希望为此特定卷覆盖该设置,这可能会很有帮助。

当您点击“Apply”时,EncFSGui将构建一个“expect”脚本并启动该脚本,将密码作为参数传递给它。它将等待“expect”完成,并检查是否在encfs加密文件夹中创建了一个名为 .encfs6.xml 的文件。该文件包含该文件夹的encfs配置。切勿自己更改此文件,因为您很可能会破坏事物。请务必将副本保存在某处,因为如果文件丢失或损坏,您将无法再挂载encfs文件夹。

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

如果您在表格中选择一行,其他一些按钮将变为可见:Browse、Remove、Info和Edit。

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

挂载和卸载文件夹

要将encfs文件夹挂载为明文卷,只需在表格中选择相应的行,然后点击“Mount & expose”按钮。除非您已将EncFSGui配置为将密码存储在钥匙串中,否则系统将提示您输入密码。然后,EncFSGui将构建一个encfs命令,传递密码,尝试挂载所选文件夹。

当卷被挂载时(通过检查“mount”命令的输出确认),表格将指示文件夹已挂载。“Mounted”列将显示“YES”,并且该行的颜色将从蓝色变为红色。

EncFSGui将最多提示输入密码5次,然后放弃。添加更多的“暴力破解”保护没有意义,因为通过encfs也很容易编写脚本。如果连篱笆都没有,何必关上一扇门。

要卸载,只需选择已挂载卷的行,然后使用“Unmount & lock”按钮。请务必先关闭任何打开的文件,以避免数据丢失。

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

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

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

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

“Open Existing”对话框如下所示:

正如您所看到的,它与“创建新encfs文件夹”对话框非常相似,但无法设置加密设置。毕竟,在encfs文件夹创建后,我们无法更改任何这些设置。其他选项应该是不言自明的(因为它们与“创建新encfs文件夹”对话框中的选项相同)。

点击“Apply”不会对挂载状态产生任何影响。

编辑卷

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

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

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

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

浏览卷

如果您不知道在哪里查找已挂载的(明文)卷,可以通过“Browse”按钮浏览/打开它。在表格中双击已挂载的卷也会触发相同的操作。

常见问题解答

  1. 我的encfs文件夹的密码安全吗? 嗯,我不知道。EncFSGui不保存密码,但它会处理密码,并在您创建新的encfs文件夹时将其用作“expect”脚本的参数,并且在挂载卷时也会将其回显给encfs。如果您认为这对您来说不够安全,请使用encfs命令行工具手动挂载您的文件夹。

  2. 有时,EncFSGui似乎无法卸载我的卷 由于EncFSGui是一个包装器,它依赖于诸如umount和mount之类的工具。正如您在 https://github.com/osxfuse/osxfuse/wiki/Mount-options 中看到的(查找“kill_on_unmount”),在某些已知情况下,尽管执行了umount命令,卷仍保持挂载状态。无论如何,EncFSGui将显示正确的挂载状态(因为它只是简单地转换它在mount输出中看到的内容)。

  3. 一些osxfuse挂载选项看起来很有趣。您会实现其中的一些吗? 可能会,是的。

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

想帮忙吗?

如果您确实想帮忙,请查看Github仓库。它包含了如何设置开发环境的所有说明。 请创建新的分支(不要针对主分支提交PR),并且请不要在您的PR中提交dmg文件。(换句话说,不要运行“make release”)。

© 2016 – 2021, Peter Van Eeckhoutte (corelanc0d3r)。保留所有权利。

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