RSS订阅信息安全技术跟踪与研究:技术、平台、会议、论文、产业
你现在的位置:首页 / 技术积累 / 正文

EncFS加密文件系统:简介、源码编译、与使用

5 技术积累 | 2015年1月29日
转载申明:本站原创,欢迎转载。但转载时请保留原文地址。
原文地址:http://www.vonwei.com/post/introduceToEncFS.html

简述

         EncFShttps://vgough.github.io/encfs/)是一个开源的软件,在用户空间提供加密文件系统,其基于最流行的开源文件系统FUSEhttp://fuse.sourceforge.net/)库运行(其使用FUSE库和FUSE内核模块来提供文件系统的接口)。EncFS最早在2003年发布,至今已经有10多年的历史。EncFS主要用于Linux系统,能够透明加密文件,使用任意目录存放加密文件,每个用户都可以在自己的目录或者文件系统中创建一个加密的空间,这个空间只有用户自己才能加载和访问,其它用户只能看到密文乱码。

         EncFS使用的加密算法来自第三方库,默认是使用OpenSSL,对文件名和文件内容都会进行加密。加密所有文件名和内容的密钥是卷密钥(称为volume key),而这个密钥需要用户提供password才能解密出来,这意味着用户的password可以随便改变,而volume key实际上不变,文件也就没必要重新加密,方便使用。EncFS提供两种加密模式:流加密,用于对文件名和文件结尾的部分数据块加密,CFB流模式;分组加密,固定规模的文件系统块使用其CBC模式进行加密。在每个EncFS文件系统的底层加密存储空间中存在一个配置文件,在文件系统创建时会自动生成,对于EncFS版本0.20.6,配置文件是“.encfs3”,而EncFS版本1.0.X使用配置文件“.encfs4”,1.1.X使用“.encfs5”。不同版本的EncFS使用可能不兼容,因为其使用的算法和选项可能都有变化,因此实际使用时注意保持EncFS的版本一致。除了主要的可执行程序encfs外,另一个可执行程序encfsctl可以用于显示关于文件系统的信息,如使用的加密算法、密钥长度、块大小,而且其还可以用来修改用户password

安装EncFS

         https://github.com/vgough/encfs下载EncFS的最新源代码,下载下来为“encfs-master.zip”,解压缩即可,master表示是比较稳定的版本,目前EncFS还在不断开发和完善中。下面实验在ubuntu 14.04下完成:

         1)安装基本构建工具:

# apt-get install build-essential autoconf automake make libtool autopoint

         注意安装autopoint,否则下面执行autoreconf –if时会出错

         2EncFS依赖的库还有openssl fuse boost-serialization gettext libintl,分别安装之:

# apt-get install libfuse-dev libssl-dev librlog-dev libboost-serialization-dev

         3)进入到解压后的encfs-master目录,三步编译EncFS

# autoreconf –if

# ./configure --with-boost-libdir=/usr/lib/i386-linux-gnu --prefix=/usr/local/encfs   

         注意--prefix用于指定安装目录为/usr/local/encfs

         --with-boost-libdir用于指定boost-serialization库的安装路径,由于通过apt-get安装其不在默认路径下,configure会出错,只能手动指定。

         configure之后就生成了Makefile文件,就可以正常进行make操作了。

# make

         4)此步骤可选,主要用于测试编译生成的库是否运行正常

# make test

         5)编译完成后,会在主目录的encfs目录下生成两个可执行程序encfs encfsctl,可以运行下面的命令进行安装

# make install

         进入之前指定的目录/usr/local/encfs下,会发现多了三个文件夹binlibshare,作用显而易见,不用多说了。

试用EncFS

         可执行程序encfs的详细使用方式可以参考https://github.com/vgough/encfs/blob/master/encfs/encfs.pod,主要用于挂载或者创建一个加密的虚拟文件系统。

         基本使用方法为:

# ./encfs [options] rootDir mountPoint [-- [FUSE Mount Options]]

         EncFS创建的虚拟加密文件系统,加密的数据存储在rootDir目录中,而非加密的数据在mountPoint目录可见。EncFS的加密主要采用外部工具(默认是openssl),用户需要提供一个password用于对文件名和文件内容进行加密。如果EncFS在指定的rootdir处找不到一个支撑的文件系统,就会提示用户是否需要创建一个新的加密文件系统。[options]可以指定各种选项,用户可以控制各种功能和算法的使用。

         -i文件系统一段时间处于不活动状态(),会自动unmount,最短可以指定的时间是1分钟(单位是分钟)。

         -fEncFS默认运行模式是在后台,日志消息通过syslog记录,-f可以让其在前台运行,可以在控制台看到一些中间处理过程和消息。

         -v一般以-f运行时,建议开启-v,会启用EncFS内部各种调试通道的日志。

         -s默认EncFS是多线程模式运行,-s使得其以单线程模式运行,EncFS开发阶段建议该模式,方便调试。

         -d启用FUSE库的debugging,怀疑FUSE有问题时开启,使用时首先开启-v

         --public默认,所有基于FUSE的文件系统都只对挂载其的用户可见,其它用户(包含root)无法查看文件系统内容,而使用该选项使得encfs表现为一个典型的多用户文件系统。

         --ondemand-i--extpass混合使用才有意义,用于按需的挂载文件系统,文件系统空闲时不再退出,只是通过放弃内部引用禁止访问,想要重新文件系统时,需要使用extpass程序获取用户的password

         --extpass=program指定一个外部程序来获取用户password,例如--extpass=/usr/lib/ssh/ssh-askpass

         --delaymountencfs开启时并不加载文件系统,而是等到第一次使用时加载,该选项和--ondemand一起使用才有意义。

         --reverse正常情况下EncFS储存密文数据,并按需要显示明文数据;而使用该选项,EncFS使用源明文数据,并按需产生密文数据。这种功能主要用于创建远程加密备份。例如,命令“encfs --reverse /home/me /tmp/crypt-view”会在/tmp/crypt-view创建一个加密视图,可以复制该目录,保存加密数据的一个备份,而且必须同时保存一个关于文件系统信息的配置文件(/home/me/.encfs5)的备份,使用两者才能恢复出明文数据(“ENCFS6_CONFIG=/home/me/.encfs6.xml encfs /tmp/crypt-view /tmp/plain-view”)。这样/tmp/plain-view包含的数据就与/home/me一致,即明文数据。注意--reverse使用时可能让很多其它选项失效。

         --standard创建一个新文件系统时,会自动选择标准配置选项,帮助文件系统的自动创建。

         -S从标准输入读取password,没有提示。在写encfs mounts脚本时可能有用。注意必须首先保证加密文件系统和挂载点存在,不然encfs会提示文件系统创建选项,可能干扰你写的脚本。

         --anykey关闭密钥验证检测。主要作用是允许EncFS使用次级passwords,如在一个加密的文件系统中存储隔离的文件组。EncFS会忽略掉无法正确解码的文件,因此使用次级passwords创建的文件只有在使用其关联的password加载文件系统时才能可见。注意,如果主password改变了(如使用encfsctl),那么其它passwords也无法使用。

         环境变量ENCFS6_CONFIG:用来使用配置文件,典型命名为.encfs6.xml。默认情况,配置文件是从加密的目录中读取,而使用这个选项使得配置文件可以隔离于加密的文件单独进行存储。注意,如果配置文件丢失,那么加密的文件内容也就无法恢复了,因此配置文件包含使用用户password加密的主密钥,没有主密钥,数据是无法恢复的(即便你知道password)。

 

实例一:创建一个加密的文件系统

进入到安装目录bin下(cd /usr/local/encfs/bin),运行如下命令:

 

# ./encfs /opt/EncFS/.cryptFS /opt/EncFS/plainFS

         创建过程中会要求输入用户password,记住即可。

         /opt/EncFS/.cryptFS是密文目录,/opt/EncFS/plainFS是对应的明文目录。

         通过mount命令,可以看到增加了一个挂载点:encfs on /opt/EncFS/plainFS type fuse.encfs (rw,nosuid,nodev,default_permissions)

         在明文目录中创建一个test文件。然后看下加密目录中的情况如下:

 

root@ubuntu:/opt/EncFS/.cryptFS# ls .

         l-zJ1VLow1rzT25eIeanFnVq  -O25D9iSkZe1IEr7iF7Ps56a //没有test文件,都是加密的乱码

root@ubuntu:/opt/EncFS/.cryptFS# ls .

         ./           ../          .encfs6.xml 

 

root@ubuntu:/opt/EncFS/.cryptFS# cat .encfs6.xml  //查看配置文件,配置内容显示如下

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<!DOCTYPE boost_serialization>

<boost_serialization signature="serialization::archive" version="10">

<cfg class_id="0" tracking_level="0" version="20">

         <version>20100713</version>

         <creator>EncFS 1.7.5</creator>

         <cipherAlg class_id="1" tracking_level="0" version="0"> //加密算法

                   <name>ssl/aes</name>

                   <major>3</major>

                   <minor>0</minor>

         </cipherAlg>

         <nameAlg>

                   <name>nameio/block</name>

                   <major>4</major>

                   <minor>0</minor>

         </nameAlg>

         <keySize>192</keySize>  //密钥大小

         <blockSize>1024</blockSize>  //分组大小

         <uniqueIV>1</uniqueIV>

         <chainedNameIV>1</chainedNameIV>

         <externalIVChaining>0</externalIVChaining>

         <blockMACBytes>0</blockMACBytes>

         <blockMACRandBytes>0</blockMACRandBytes>

         <allowHoles>1</allowHoles>

         <encodedKeySize>44</encodedKeySize>

         <encodedKeyData> //加密后的主密钥volume key

+XVUyLzA5co75/VuNz9PX6APc2nXhLKPBqpn/GPnCOsdNxhvchFOLWVdXC0=

         </encodedKeyData>

         <saltLen>20</saltLen>

         <saltData>

TnTvM7Td/6+z3eznF26UyH7G7eo=

         </saltData>

         <kdfIterations>309909</kdfIterations>

         <desiredKDFDuration>500</desiredKDFDuration>

</cfg>

</boost_serialization>

 

实例二:卸载加密文件系统后,重新加载

         刚才创建了一个加密的文件系统/opt/EncFS/.cryptFS,使用如下命令卸载

 

# fusermount -u /opt/EncFS/plainFS

         会发现/opt/EncFS/plainFS目录下面已经没有任何内容,而加密文件系统/opt/EncFS/.cryptFS里面的密文内容依然还在。输入下面命令进行重新加载:

 

# ./encfs /opt/EncFS/.cryptFS /opt/EncFS/plainFS

         首先要求输入password,正确输入后,plainFS下面可以看到正确的明文内容。如果输入password错误,会提示“Error decoding volume key, password incorrect”,plainFS下面也会看不到任何明文内容。

         使用encfsctl显示加密的文件系统信息,如下命令:

 

root@ubuntu:/usr/local/encfs/bin# ./encfsctl /opt/EncFS/.cryptFS

Version 6 configuration; created by EncFS 1.7.5 (revision 20100713)

Filesystem cipher: "ssl/aes", version 3:0:0 (using 3:0:2)

Filename encoding: "nameio/block", version 4:0:0 (using 4:0:2)

Key Size: 192 bits

Using PBKDF2, with 309909 iterations

Salt Size: 160 bits

Block Size: 1024 bytes

Each file contains 8 byte header with unique IV data.

Filenames encoded using IV chaining mode.

File holes passed through to ciphertext.

 

就简单的介绍在这里了,使用上面的选项和配置文件,可以实现更多丰富的功能,刚兴趣可以自己去尝试。。。


  • ------------------分隔线----------------

  • 如果感兴趣,欢迎关注本站微信号,跟踪最新博文信息,手机微信扫一扫下面的二维码,即可关注!
  • 微月信公众号
  • 推荐您阅读更多有关于“ 安全软件  加密文件系统  EncFS  加解密工具   ”的文章

    请填写你的在线分享代码
    上一篇:密码哈希算法SM3的Java实现下一篇:云存储安全:五种加密云文件的方法

    猜你喜欢

    评论列表:

    • 2
       隐形窗纱  发布于 2015-6-13 9:21:06  回复该留言
    • 不错的文章,内容惊涛骇浪.禁止此消息:nolinkok@163.com
    • 4
       踏步板  发布于 2015-6-17 0:44:21  回复该留言
    • 好文章,内容惊涛骇浪.禁止此消息:nolinkok@163.com

    发表评论

    必填

    选填

    选填

    必填,不填不让过哦,嘻嘻。

    记住我,下次回复时不用重新输入个人信息

    本站介绍
    最近发表
    本年最热文章
    本月最热文章
    网站分类
    文章归档