2022-01-07-encfs windows下的encfs mp相关使用记录
一、使用原因
首先,数据仅储存在电脑上容易不稳、可携带性差,所以需要网盘等在线工具保存。
如果放在线上:
- 放在网盘上,一种方法是直接整体加密。如果这样,使用起来就很麻烦:每次都需要加密完上传,下载后解密,版本更新、文件夹打包层次、增量上传、更改删除等都极度不方便。
- 使用一些针对性工具,例如wiznote、印象笔记等。缺点:可保存格式有限,需要以文件夹、pdf集合、mp3等上传的,都需要更改成工具支持的形式;工具支持的空间有限;保存完使用的时候又需要再麻烦一下。
- 放在网盘上,以文件夹形式自动分别加密。也就是下面理想工具的形式:可选择同步+加密。类似加密版本的onedrive。
理想的工具:
- 本地展示:可以以工具显示为正常文件夹,如同正常管理器一样使用,例如对MP3文件可以调用mp3播放器等使用。
- 底层保存:放进去的文件、文件夹,底层都以另外的加密格式保存,这点不必要,但上传网盘时要保证这点。
- 上传网盘:当上传网盘时,都以加密形式的结果为内容,上传加密的文件、文件夹。
- 下载文件:可以单独下载某个文件、文件夹,并且通过1来正常使用。
简而言之,想达到的一个状态是:本地使用时和当前文件管理器一致,底层的(文件名、)文件内容编码完全替换成另外的形式,上传时以另外的编码形式上传保存。
这样可以达到的一个目的:所有当前的本地应用都可以正常使用,不用对每个应用都进行改进实现方式以加入加密功能;网盘端保存的都是加密编码的内容。
在寻找中,找到了一个encfs的加密方式,完全符合我的要求。还据说拥有多端使用的功能,如果再配合webdav的挂载本地盘的使用,可谓神器。
由于网上资料还是比较少,于是最近自己尝试了一发。
二、windows下的工具encfs mp
encfs是一种使用AES进行加密的文件系统,在github上开源encfs。
在windows端的工具是encfs mp,Android端据说是Mixplore,Linux端命令行即可。
后两者还没使用过,这次主要是使用了windows下的encfs mp。
0. 简单介绍
- EncFS加密目录:先使用这个工具创建一个encfs。encfs需要以一个目录为EncFS文件系统目录,在这个目录中,存放都是加密过的文件、文件夹。
- 显目录:使用encfs mp挂载一个EncFs文件系统目录后,每挂载一个会出现一个盘符,我把它叫做显目录。在该盘中可以和一般盘一样存放文件、文件夹,和其他盘一样使用,唯独不同的是:这里显示存放的内容实际上全都以加密方式存放在EncFS加密目录中,当挂载取消时,这个显目录就没了。实际上,显目录只是给一个以一般使用的过程来存放、读取、使用文件的界面,实际文件等都加密保存在加密目录中去了。
- .encfs6.xml:在encfs加密目录下,据说很重要,丢失则打不开了 。我看了一下,里面除了有创建时设定的信息外,还有一个
encodeKeyData
的字段,如果这个字段保存的直接是AES加密使用的密钥,就不太安全了。具体是啥没看代码不清楚,需要以后确认。
1. 下载安装
在github上encfs mp下载,现在的版本是0.99.1,只有7.34MB。
安装就一路安装下来完事。
2. 外观与使用
-
打开是这样的,里面的两个是我自己创建好的,初始的应该没有。
-
之后选择
Create New Encfs
, 逐个填写。
-
创建好后,出现在Mounts栏目中。选上对应项,点击Mount。之后可以在文件管理器中看到对应的盘符。该盘显示的大小和encfs文件系统所在的盘大小一致,例如testciv为创建出来的,encfs文件系统在anything盘下。testciv是显目录,往testciv中放文件,会自动加密保存到encfs中。
下面逐一解释创建时的选项:
- Mount name:随便起一个,这个名字是之后显目录的名字。
- EncFS path:加密目录的位置。
- password/Retype Password:输入密码。
- Local drive:本地硬盘。估计是可以挂载映射成本地硬盘的网盘。
- Cipher algorithm: 当选专家模式时,可选
AES
、Blowfish
、CAMELLIA
。 - Cipher keysize: 密钥长度,我选的
256
. - Cipher blocksize: 分块加密每块的大小,越大的话加密速度越快,所以我选的
4096
. - Name encoding:
Block
:“使用块加密,将文件名字隐藏到某些地方。”我用了这个形式后,发现只要加密目录里文件名/文件夹名字改了,挂载后这个文件/文件夹就不显示了。Null
:“不对文件名字进行加密。”Stream
:“流加密,将使得文件名保持得尽量短。” 对文件夹名、文件名也需要加密的,可以选Block或者Stream。 - Per-block HMAC:“在单个文件的所有加密块中,增加块确认码,每个块会增加大概12字节内容,会显著地影响性能。但它也同样意味着,任何单个块内的修改和错误都会被捕捉到,因而无法读取。”会影响性能,不选。
- Unique IV:“每个文件使用单独的初始向量计算。对每个文件会会增加8字节的存储空间”。AES加密的形式之一。必然选上。
- Chained IV:“每个文件名初始化时使用链式的初始化向量。使得每个文件名编码取决于完整路径而不是单独编码。”看自己选择是否要隐藏目录信息,选择后,文件名相同也会在加密目录下有不同的加密文件名。
- External IV:“文件名加入到IV header chaining中。这会使得每个文件数据编码取决于完整的文件路径。一旦文件名字改动了,那么会解码失败,除非是使用正确密码打开encfs文件系统后改动的。如果这个选项被选择后,硬链接的形式也不再被支持。该选项可能和一些云供应商不兼容,因为在这时候改了文件名但不会改变文件的时间戳,这样云端可能不会进行同步。对包含有云端使用的情况,这个选项不推荐。” 不选。
- Key derivation duration(ms):我直接选了
3000
ms。相关细节没了解。
三、几种情况的测试
首先对我来说,Per-block HMAC与External IV不必选,Unique IV必选。
主要要测试一下,Name encoding、Chained IV的组合有什么特点。
Chained IV\Name encoding | Block | Null | Stream |
---|---|---|---|
Yes | 1.加密目录下文件名乱码;2.加密目录下文件、文件夹名字改动后,显目录刷新就看不到对应项,改回后恢复。 | 1.两目录下文件名相同;2.加密目录下文件名修改后,显目录该文件名也改变了,但正常使用。 | 1.同block情况,名字短一些 |
No | 1.加密目录下文件名乱码,但若文件名相同,则名字编码相同。2.加密目录下文件、文件夹名改动后,显目录刷新不显示,改回后恢复。 | 同Null的Yes情况。 | 同Block的No情况。 |
测试结果是:
- Chained IV选项:如果加上Chained IV选项,加密目录中的文件名、文件夹名会根据路径来计算,所以显目录有两个不同层次相同名字的文件、文件夹,加密目录中这两个文件、文件夹的名字也会不一样。这种设计,大概是为了完全隐藏目录名包含的信息,因为如果不带上Chained IV选项,则在加密目录中出现相同名字的文件、文件夹,或许会因此暴露一些信息。
- Name encoding选项:Block、Stream相似,都是对名字进行加密了,在加密目录中名字改动后,显目录中将无法读取。Null选项则保持加密目录与显目录内名字相同,只对文件内容进行加密,两边改动一方都会影响另一方名字,但内容仍然可以成功读取。如果使用了Null,文件名、目录名等路径信息将完全暴露,如果名字里包含了太多信息,则会产生安全问题。
结论:若要隐藏路径的信息,选择block/stream + Chained IV;若不需要,让目录、文件名保持原样,Name encoding使用Null,Chained IV无效。
四、可能的隐患
对encfs的代码实现未曾看过,所以对.encfs6.xml
会暴露哪些信息不清楚,对该文件中encodeKeyData
字段如何被使用,是否存在问题尚未清楚。