一种透明加解密文件系统的设计与实现

2017-09-23 02:57颜智润李春杰梁会武
计算机应用与软件 2017年9期
关键词:调用内核解密

颜智润 李春杰 梁会武 位 珣

(中国科学技术大学苏州研究院 江苏 苏州 215000)

一种透明加解密文件系统的设计与实现

颜智润 李春杰 梁会武 位 珣

(中国科学技术大学苏州研究院 江苏 苏州 215000)

提升计算机安全性,保护敏感数据成为目前的热点问题。加密文件系统作为一种数据加密存储技术可以有效防止非法入侵者窃取用户机密数据。设计一种基于堆叠式文件系统的安全防护策略,屏蔽了具体文件系统的操作差异,实现透明高效的加密、解密。在不改变用户使用习惯的前提下添加加密、解密过程,用户使用时将密文形式存储的数据解密为明文,加、解密算法以当前较为成熟的Blowfish算法为基础在内核层完成,并且每个文件拥有独立密码,极大增加了破解难度,整体实现性能和易用的平衡。

加密文件系统 信息安全 透明

0 引 言

近年来,计算机安全技术不断发展成熟,人们对于计算机系统安全问题考虑得越来越多,对于计算机系统的安全性提出了更严格的要求。目前国内涉及操作系统的文件加密大部分都是针对在Windows操作系统下的文件加密软件,针对Linux系统的文件加密产品较少。同时国内外已有的数据文件加密产品普遍存在以下几个问题:一是可移植性差,大部分都是针对Windows操作系统进行设计和开发,对于Linux环境下的数据安全产品很少;二是效率和性能较差,目前已有的较成熟文件加密系统在安全性、稳定性、可移植性、系统维护便捷性等方面存在一定的不足,在实际应用中难以圆满完成用户所期待的任务功能。

本文提出基于Linux的透明文件加密系统是防止存储数据泄密的产品。该系统在不改变用户使用习惯和计算机存储文件格式和状态的情况下,对文件进行实时、透明的加/解密。保密文件数据在存储介质中以密文形式存放,对于没有访问权限的用户,即使通过非法手段得到存储设备,也无法获取明文信息,所有未经授权的数据,都将以乱码形式出现。

透明加解密文件系统工作模式如下:

图1 工作模式图

用户写操作通过加密文件系统将明文数据转化为密文后写入在存储设备中,读操作将密文转化为明文。

1 文件系统架构分析

计算机中可以拥有多种不同具体的文件系统类型,如常见的ext2、ext3、ISO9660等,传统Linux文件系统管理通过虚拟文件系统VFS(Virtual Filesystem Switch)进行管理[1]。为具体文件系统提供了通用的接口,使得上层进程在进行与文件系统相关的操作时可以使用同一组系统调用,而内核中根据不同的文件系统执行对应的具体操作。VFS模型,如图2所示。

图2 堆叠式文件系统读过程模型

VFS引入了一个通用的文件模型,这个模型能够表示所有支持的文件系统[2]。由文献[1]可知, VFS对用户屏蔽了具体文件系统的操作细节。而堆叠式文件系统位于VFS层之下,提供了相应读写函数接口。读过程模型如图3所示。

图3 堆叠式文件系统读过程模型

在堆叠式文件系统中添加加解密模块,用户在读文件时,从存储介质中取出的密文数据通过解密模块解密为明文后传给用户层;用户执行写文件时,用户层传递的明文数据通过加密模块加密后存入存储介质。

堆叠式文件系统完美实现了兼容和透明两个方面的需求,本文基于此提出透明加解密文件系统的设计方案。

由文献[2-3]可知,堆叠式文件系统Wrapfs是符合以上描述的一种理想的空白文件系统模型,为使用者提供了通用的读写接口wrapfs_read 和wrapfs_write,符合本文的设计理念。本方法基于Linux-4.2.5版本内核,采用wrapfs文件系统进行研究、设计。

2 Linux透明加密文件系统的设计

文件系统架构以Linux 4.2.5版本内核源码为基础,针对具体文件系统ext2,对读操作进行分析跟踪。在此基础上,设计本文提出的透明加解密文件系统。

2.1 Linux文件系统读写过程

用户read()操作的系统调用从用户层进入内核层,如图4所示。

图4 Linux系统read()系统调用流程图

1) 当用户层程序调用read() 时,操作系统将其转换成sys_read(),sys_read() 获得文件描述符fd、用户缓存指针buf以及读入缓存字节数count[4]。

2) 然后调用vfs_read(),如果已经定义读操作,则使用该读操作,否则调用new_sync_read(),通过代码跟踪,通常具体文件系统最后也会调用该函数。

3) 接着跟踪fs/mm/filemap.c中的generic_file_read_iter()可知,该函数转而调用具体文件系统的readpage() 函数,对于ext2而言实际调用ext2_readpage()。具体读文件操作将读到数据返回给用户层,完成整个读操作。

2.2 透明加解密文件系统的设计

本文通过对Linux文件系统文件读写操作的分析跟踪[4-7],利用VFS层屏蔽具体文件系统操作差异的特性提出透明加解密策略。

Linux系统不同的读取方式如read,fread,cin等,本质上都是通过调用vfs_read()函数,使用具体文件系统的读函数,读取特定大小的数据块到缓冲区。针对这一工作模式,考虑在对具体文件系统的读写操作之前添加加解密功能,以避免触及具体文件系统的数据。对具体文件系统传回的数据,经解密模块处理后再传回上层缓存空间。

结合前一节对linux文件系统读写过程的分析,在wrapfs层的wrapfs_read()中添加解密单元,在wrapfs_write()函数中添加加密单元。以写过程为例,系统调用sys_write()进入VFS层,vfs_write()得到用户层传递的数据块内存区域地址,之后映射到wrapfs_write()函数,接着调用加密单元Blowfish_encode_men()对内存中数据进行加密,并覆盖内存原先的明文数据,返回wrapfs_write()继续调用具体文件系统写函数,将密文数据写入硬盘等设备。透明加密写文件流程,如图5所示。

图5 透明加解密写文件流程图

详细工作过程如下:

1) 首先需要将wrapfs 注册到内核中[2-3],此过程在全局链表file_systems中添加wrapfs文件系统的链接。

2) 执行挂载wrapfs操作,此时会在内核中创建一个path结构,其中包含底层文件系统挂载点dentry和superblock等内容。并创建一个新的inode节点,将底层文件系统的superblock和inode节点信息绑定到对应的private data中。关键代码如下:

/* 包含底层文件系统挂载点的dentry和superblock */

struct path {

struct vfsmount *mnt;

struct dentry *dentry;

};

/* 创建新的inode节点,并且将底层inode和superblock绑定到private data中 */

/* sb代表wrapfs层的superblock */

/* lower_sb为底层文件系统的superblock */

inode = wrapfs_iget(sb, d_inode(lower_path.dentry));

/* 绑定底层superblock到private data */

static inline void wrapfs_set_lower_super(struct super_block *sb, struct super_block *val){

WRAPFS_SB(sb)->lower_sb = val;

}

/* superblock to private data */

#define WRAPFS_SB(super) ((struct wrapfs_sb_info *)(super)->s_fs_info)

3) sys_write()调用fdget_pos()以用户层传递的fd号为参数获取对应file结构体对象(在执行打开文件时创建file结构,该结构由第(2)步中的结构体信息填充);之后调用vfs_write(),通过获取到的file结构体找到具体写函数wrapfs_write(),见图5中①过程。

/* 找到对应文件系统的写函数 */

file->f_op->write(file, buf, count, pos); //

4) 在wrapfs_write()中开辟的内核空间中对用户层传递的数据执行加密操作,见图5中③过程;将加密数据覆盖原明文数据,见图5中②过程;调用wrapfs_lower_file获取底层文件系统file结构,再次调用vfs_write将加密后数据写入底层文件系统中,见图5中④⑤过程。

5) 将写字节数ret返回给上层。完成文件系统的一次写操作。

读文件操作与写操作类似,简要介绍如下,用户空间的read() 函数在内核中的服务例程为sys_read(),映射到wrapfs_read() 函数,通过vfs_read() 进入具体文件系统进行相应的读操作。之后进入解密单元对相应密文数据解密,将解密后数据返回给用户层。

3 透明加解密模块的实现

3.1 加密算法的选取

基于密钥的加密算法主要有对称算法和非对称算法。非对称算法速度较慢,主要应用于数字签名,密钥分配等任务,对于本文设计的文件加密并不合适,所以选择以下几种比较成熟、公认比较安全的算法进行比较,包括DES、3DES、AES和Blowfish等算法,测试结果如表1所示。

表1 几种常用的对称加密算法加解密测试

Blowfish自公布以来,仍未发现实际有效的攻击手段,其算法的子密钥由算法本身生成,使得加密后数据不可辨认,密钥分析也极其困难。通过比较,本文在设计加密文件系统时采用Blowfish算法。

3.2 加密算法的实现

为实现透明加解密功能,本文以堆叠式文件系统为框架,采用已有成熟算法Blowfish,在内核层实现加密解密操作。

初始化挂载文件系统时,以用户名,挂载点路径和用户输入密码为参数,调用wrapfs_get_encode_pwd产生固定长度序列,调用该函数可以把用户输入的简单密码转化为定长的随机序列,避免字典攻击等暴力破解手段非法获取密码。用户层发起读写请求,陷入内核态后,在内核态内存空间处理数据后,把密文写入底层或者把明文返回给用户空间。

由文献[8-10]可知,BlowFish算法由两部分组成,密钥扩展和数据加密,密钥扩展用于把密钥扩张到4 168字节的子密钥,数据加密使用简单的16轮迭代,主要使用加法运算异或运算。加密时通过给定的密钥key对源密钥,即通常所说的两个固定的“盒”pbox[18]和sbox[4,256]进行变换,得到下一步加密信息所需的key_pbox和key_sbox。

BlowFish算法中,有一个核心加密函数: gBlowFishDeCode。该函数输入64位信息,运算后,以64位密文的形式输出[12]。用BlowFish算法加密信息,需要两个过程,该算法的加解密流程图如图6所示。

图6 Blowfish文件加密解密流程图

文件加密过程描述如下:

1) 密钥预处理

BlowFish算法的源密钥——p盒和s盒是固定的[10]。首先得到key,用这个key对p盒和s盒进行变换,得到下一步信息加密所要用的gKeyBoxes。

2) 信息加密

读入64位数据,分别获取其高32位和底32位,操作为xL0 = data64 >> 32;xR0 = data64 & 0x0000 0000ffffffff;然后将xL0与gKeyBoxes进行异或操作,保存在XR中,接着调用gBlowFishFunction(xR) 函数后与xR0异或保存在XL中。之后xR0 = xR,xL0 = xL,并xL = xR0 ^ gKeyBoxes[0],xR = xL0 ^ gKeyBoxes[1]。最后将二者合并即可得到密文64位。

解密过程简述如下:

1) 密钥预处理

密钥预处理的过程与加密时完全相同。

2) 信息解密

信息解密的过程就是把信息加密过程的gKeyBoxes逆序使用即可。

4 性能分析

选取1、2、4到64 MB文件进行加密解密测试,得到时间结果统计,如图7所示。加解密时间基本一致,并且随文件体积增大而递增。

图7 加解密相同类型不同文件大小时间统计(blowfish)(缓存1 KB)

测试29.3 MB文件分别以 0.5、1、2到10 KB缓存大小进行加解密测试,在一定范围内,加密过程较慢,加解密时间和缓存大小基本无关。测试结果如图8所示。

图8 缓存大小对算法时间的统计(blowfish)

加解密系统无可避免会损失一部分的性能,加解密过程中的其他操作也会对时间产生一定影响。测试结果表明,本文将加解密过程置于内核层中,提高了安全性的同时,对性能损耗基本可以降到用户接受范围内。

5 结 语

本文提出并实现一种基于堆叠式文件系统的透明加密、解密系统。以堆叠式文件系统为框架结合VFS层操作实现对任意文件类型的加解密操作。使透明加密具有更高的安全等级,更低的性能损失,实现了兼容性强、对用户透明、加密速度快和安全性高的加解密文件系统。

[1] Bovet D P,Cesati M.Understanding the Linux kernel[M].3rd ed.O’Reilly Media,Inc.,2005.

[2] Zadok E,Badulescu I.A stackable file system interface for Linux[C]//Proc of the 5th Annual Linux-Expo Conference Proceedings,1999,94.

[3] Zadok E,Badulescu I,Shender A.Extending File Systems Using Stackable Templates[C]//Proc of the 1st USENIX Annual Technical Conference,General Track,1999:57-70.

[4] Rodriguez C S,Fischer G.The Linux kernel primer:a top-down approach for x86 and PowerPC architectures[M].Pearson Education India,2006.

[5] 马克斯韦尔,冯锐.Linux内核源代码分析[M].机械工业出版社,2000.

[6] 毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2001.

[7] Stevens W R.UNIX环境高级编程:英文版[M].机械工业出版社,2002.

[8] Nie T,Zhang T.A study of DES and Blowfish encryption algorithm[C]//TENCON 2009-2009 IEEE Region 10 Conference.IEEE,2009:1-4.

[9] Vaudenay S.On the weak keys of Blowfish[C]//Fast Software Encryption.Springer Berlin Heidelberg,1996:27-32.

[10] Schneier B.Description of a new variable-length key,64-bit block cipher (Blowfish)[C]//Proc of the 1st Fast Software Encryption.Springer Berlin Heidelberg,1993:191-204.

[11] Stallings W.密码编码学与网络安全:原理与实践[M].刘玉珍,王丽娜,傅建明,译.北京:电子工业出版社,2006:131-135.

[12] Bruce Schneier.应用密码学:协议.算法与C源程序[M].2版.机械工业出版社,2014.

DESIGNANDIMPLEMENTATIONOFATRANSPARENTENCRYPTIONFILESYSTEM

Yan Zhirun Li Chunjie Liang Huiwu Wei Xun

(SuzhouInstituteforAdvancedStudy,UniversityofScienceandTechnologyofChina,Suzhou215000,Jiangsu,China)

Enhancing computer security to protect sensitive data has become a key problem nowadays. The proposed approach provides users with effective protection for preventing illegal invaders stealing the confidential information. This paper designs a safety protection strategy based on the stackable file system which is independent of any particular file system. Users do not have to change their habits while adding encryption and decryption transparently. The blowfish algorithm is taken as the foundation of this strategy within the kernel layer, converting information between plain text and cipher text. Different files own their independent password. In addition, this encrypted file system greatly enhances the difficulty of being cracked and balance the performance and ease of use.

Encrypted file system Information security Transparent

TP3

A

10.3969/j.issn.1000-386x.2017.09.002

2016-11-09。江苏省科技项目-基础研究计划(自然科学基金:BK20141209);苏州市应用基础研究项目(SYG 201543)。颜智润,硕士,主研领域:嵌入式系统设计,信息安全。李春杰,副研究员。梁会武,硕士。位珣,硕士。

猜你喜欢
调用内核解密
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
炫词解密
活化非遗文化 承启设计内核
解密“一包三改”
炫词解密
炫词解密
核电项目物项调用管理的应用研究
微软发布新Edge浏览器预览版下载换装Chrome内核
系统虚拟化环境下客户机系统调用信息捕获与分析①