顏智潤 李春杰 梁會(huì)武 位 珣
(中國科學(xué)技術(shù)大學(xué)蘇州研究院 江蘇 蘇州 215000)
一種透明加解密文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
顏智潤 李春杰 梁會(huì)武 位 珣
(中國科學(xué)技術(shù)大學(xué)蘇州研究院 江蘇 蘇州 215000)
提升計(jì)算機(jī)安全性,保護(hù)敏感數(shù)據(jù)成為目前的熱點(diǎn)問題。加密文件系統(tǒng)作為一種數(shù)據(jù)加密存儲(chǔ)技術(shù)可以有效防止非法入侵者竊取用戶機(jī)密數(shù)據(jù)。設(shè)計(jì)一種基于堆疊式文件系統(tǒng)的安全防護(hù)策略,屏蔽了具體文件系統(tǒng)的操作差異,實(shí)現(xiàn)透明高效的加密、解密。在不改變用戶使用習(xí)慣的前提下添加加密、解密過程,用戶使用時(shí)將密文形式存儲(chǔ)的數(shù)據(jù)解密為明文,加、解密算法以當(dāng)前較為成熟的Blowfish算法為基礎(chǔ)在內(nèi)核層完成,并且每個(gè)文件擁有獨(dú)立密碼,極大增加了破解難度,整體實(shí)現(xiàn)性能和易用的平衡。
加密文件系統(tǒng) 信息安全 透明
近年來,計(jì)算機(jī)安全技術(shù)不斷發(fā)展成熟,人們對于計(jì)算機(jī)系統(tǒng)安全問題考慮得越來越多,對于計(jì)算機(jī)系統(tǒng)的安全性提出了更嚴(yán)格的要求。目前國內(nèi)涉及操作系統(tǒng)的文件加密大部分都是針對在Windows操作系統(tǒng)下的文件加密軟件,針對Linux系統(tǒng)的文件加密產(chǎn)品較少。同時(shí)國內(nèi)外已有的數(shù)據(jù)文件加密產(chǎn)品普遍存在以下幾個(gè)問題:一是可移植性差,大部分都是針對Windows操作系統(tǒng)進(jìn)行設(shè)計(jì)和開發(fā),對于Linux環(huán)境下的數(shù)據(jù)安全產(chǎn)品很少;二是效率和性能較差,目前已有的較成熟文件加密系統(tǒng)在安全性、穩(wěn)定性、可移植性、系統(tǒng)維護(hù)便捷性等方面存在一定的不足,在實(shí)際應(yīng)用中難以圓滿完成用戶所期待的任務(wù)功能。
本文提出基于Linux的透明文件加密系統(tǒng)是防止存儲(chǔ)數(shù)據(jù)泄密的產(chǎn)品。該系統(tǒng)在不改變用戶使用習(xí)慣和計(jì)算機(jī)存儲(chǔ)文件格式和狀態(tài)的情況下,對文件進(jìn)行實(shí)時(shí)、透明的加/解密。保密文件數(shù)據(jù)在存儲(chǔ)介質(zhì)中以密文形式存放,對于沒有訪問權(quán)限的用戶,即使通過非法手段得到存儲(chǔ)設(shè)備,也無法獲取明文信息,所有未經(jīng)授權(quán)的數(shù)據(jù),都將以亂碼形式出現(xiàn)。
透明加解密文件系統(tǒng)工作模式如下:
圖1 工作模式圖
用戶寫操作通過加密文件系統(tǒng)將明文數(shù)據(jù)轉(zhuǎn)化為密文后寫入在存儲(chǔ)設(shè)備中,讀操作將密文轉(zhuǎn)化為明文。
計(jì)算機(jī)中可以擁有多種不同具體的文件系統(tǒng)類型,如常見的ext2、ext3、ISO9660等,傳統(tǒng)Linux文件系統(tǒng)管理通過虛擬文件系統(tǒng)VFS(Virtual Filesystem Switch)進(jìn)行管理[1]。為具體文件系統(tǒng)提供了通用的接口,使得上層進(jìn)程在進(jìn)行與文件系統(tǒng)相關(guān)的操作時(shí)可以使用同一組系統(tǒng)調(diào)用,而內(nèi)核中根據(jù)不同的文件系統(tǒng)執(zhí)行對應(yīng)的具體操作。VFS模型,如圖2所示。
圖2 堆疊式文件系統(tǒng)讀過程模型
VFS引入了一個(gè)通用的文件模型,這個(gè)模型能夠表示所有支持的文件系統(tǒng)[2]。由文獻(xiàn)[1]可知, VFS對用戶屏蔽了具體文件系統(tǒng)的操作細(xì)節(jié)。而堆疊式文件系統(tǒng)位于VFS層之下,提供了相應(yīng)讀寫函數(shù)接口。讀過程模型如圖3所示。
圖3 堆疊式文件系統(tǒng)讀過程模型
在堆疊式文件系統(tǒng)中添加加解密模塊,用戶在讀文件時(shí),從存儲(chǔ)介質(zhì)中取出的密文數(shù)據(jù)通過解密模塊解密為明文后傳給用戶層;用戶執(zhí)行寫文件時(shí),用戶層傳遞的明文數(shù)據(jù)通過加密模塊加密后存入存儲(chǔ)介質(zhì)。
堆疊式文件系統(tǒng)完美實(shí)現(xiàn)了兼容和透明兩個(gè)方面的需求,本文基于此提出透明加解密文件系統(tǒng)的設(shè)計(jì)方案。
由文獻(xiàn)[2-3]可知,堆疊式文件系統(tǒng)Wrapfs是符合以上描述的一種理想的空白文件系統(tǒng)模型,為使用者提供了通用的讀寫接口wrapfs_read 和wrapfs_write,符合本文的設(shè)計(jì)理念。本方法基于Linux-4.2.5版本內(nèi)核,采用wrapfs文件系統(tǒng)進(jìn)行研究、設(shè)計(jì)。
文件系統(tǒng)架構(gòu)以Linux 4.2.5版本內(nèi)核源碼為基礎(chǔ),針對具體文件系統(tǒng)ext2,對讀操作進(jìn)行分析跟蹤。在此基礎(chǔ)上,設(shè)計(jì)本文提出的透明加解密文件系統(tǒng)。
2.1 Linux文件系統(tǒng)讀寫過程
用戶read()操作的系統(tǒng)調(diào)用從用戶層進(jìn)入內(nèi)核層,如圖4所示。
圖4 Linux系統(tǒng)read()系統(tǒng)調(diào)用流程圖
1) 當(dāng)用戶層程序調(diào)用read() 時(shí),操作系統(tǒng)將其轉(zhuǎn)換成sys_read(),sys_read() 獲得文件描述符fd、用戶緩存指針buf以及讀入緩存字節(jié)數(shù)count[4]。
2) 然后調(diào)用vfs_read(),如果已經(jīng)定義讀操作,則使用該讀操作,否則調(diào)用new_sync_read(),通過代碼跟蹤,通常具體文件系統(tǒng)最后也會(huì)調(diào)用該函數(shù)。
3) 接著跟蹤fs/mm/filemap.c中的generic_file_read_iter()可知,該函數(shù)轉(zhuǎn)而調(diào)用具體文件系統(tǒng)的readpage() 函數(shù),對于ext2而言實(shí)際調(diào)用ext2_readpage()。具體讀文件操作將讀到數(shù)據(jù)返回給用戶層,完成整個(gè)讀操作。
2.2 透明加解密文件系統(tǒng)的設(shè)計(jì)
本文通過對Linux文件系統(tǒng)文件讀寫操作的分析跟蹤[4-7],利用VFS層屏蔽具體文件系統(tǒng)操作差異的特性提出透明加解密策略。
Linux系統(tǒng)不同的讀取方式如read,fread,cin等,本質(zhì)上都是通過調(diào)用vfs_read()函數(shù),使用具體文件系統(tǒng)的讀函數(shù),讀取特定大小的數(shù)據(jù)塊到緩沖區(qū)。針對這一工作模式,考慮在對具體文件系統(tǒng)的讀寫操作之前添加加解密功能,以避免觸及具體文件系統(tǒng)的數(shù)據(jù)。對具體文件系統(tǒng)傳回的數(shù)據(jù),經(jīng)解密模塊處理后再傳回上層緩存空間。
結(jié)合前一節(jié)對linux文件系統(tǒng)讀寫過程的分析,在wrapfs層的wrapfs_read()中添加解密單元,在wrapfs_write()函數(shù)中添加加密單元。以寫過程為例,系統(tǒng)調(diào)用sys_write()進(jìn)入VFS層,vfs_write()得到用戶層傳遞的數(shù)據(jù)塊內(nèi)存區(qū)域地址,之后映射到wrapfs_write()函數(shù),接著調(diào)用加密單元Blowfish_encode_men()對內(nèi)存中數(shù)據(jù)進(jìn)行加密,并覆蓋內(nèi)存原先的明文數(shù)據(jù),返回wrapfs_write()繼續(xù)調(diào)用具體文件系統(tǒng)寫函數(shù),將密文數(shù)據(jù)寫入硬盤等設(shè)備。透明加密寫文件流程,如圖5所示。
圖5 透明加解密寫文件流程圖
詳細(xì)工作過程如下:
1) 首先需要將wrapfs 注冊到內(nèi)核中[2-3],此過程在全局鏈表file_systems中添加wrapfs文件系統(tǒng)的鏈接。
2) 執(zhí)行掛載wrapfs操作,此時(shí)會(huì)在內(nèi)核中創(chuàng)建一個(gè)path結(jié)構(gòu),其中包含底層文件系統(tǒng)掛載點(diǎn)dentry和superblock等內(nèi)容。并創(chuàng)建一個(gè)新的inode節(jié)點(diǎn),將底層文件系統(tǒng)的superblock和inode節(jié)點(diǎn)信息綁定到對應(yīng)的private data中。關(guān)鍵代碼如下:
/* 包含底層文件系統(tǒng)掛載點(diǎn)的dentry和superblock */
struct path {
struct vfsmount *mnt;
struct dentry *dentry;
};
/* 創(chuàng)建新的inode節(jié)點(diǎn),并且將底層inode和superblock綁定到private data中 */
/* sb代表wrapfs層的superblock */
/* lower_sb為底層文件系統(tǒng)的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()調(diào)用fdget_pos()以用戶層傳遞的fd號(hào)為參數(shù)獲取對應(yīng)file結(jié)構(gòu)體對象(在執(zhí)行打開文件時(shí)創(chuàng)建file結(jié)構(gòu),該結(jié)構(gòu)由第(2)步中的結(jié)構(gòu)體信息填充);之后調(diào)用vfs_write(),通過獲取到的file結(jié)構(gòu)體找到具體寫函數(shù)wrapfs_write(),見圖5中①過程。
/* 找到對應(yīng)文件系統(tǒng)的寫函數(shù) */
file->f_op->write(file, buf, count, pos); //
4) 在wrapfs_write()中開辟的內(nèi)核空間中對用戶層傳遞的數(shù)據(jù)執(zhí)行加密操作,見圖5中③過程;將加密數(shù)據(jù)覆蓋原明文數(shù)據(jù),見圖5中②過程;調(diào)用wrapfs_lower_file獲取底層文件系統(tǒng)file結(jié)構(gòu),再次調(diào)用vfs_write將加密后數(shù)據(jù)寫入底層文件系統(tǒng)中,見圖5中④⑤過程。
5) 將寫字節(jié)數(shù)ret返回給上層。完成文件系統(tǒng)的一次寫操作。
讀文件操作與寫操作類似,簡要介紹如下,用戶空間的read() 函數(shù)在內(nèi)核中的服務(wù)例程為sys_read(),映射到wrapfs_read() 函數(shù),通過vfs_read() 進(jìn)入具體文件系統(tǒng)進(jìn)行相應(yīng)的讀操作。之后進(jìn)入解密單元對相應(yīng)密文數(shù)據(jù)解密,將解密后數(shù)據(jù)返回給用戶層。
3.1 加密算法的選取
基于密鑰的加密算法主要有對稱算法和非對稱算法。非對稱算法速度較慢,主要應(yīng)用于數(shù)字簽名,密鑰分配等任務(wù),對于本文設(shè)計(jì)的文件加密并不合適,所以選擇以下幾種比較成熟、公認(rèn)比較安全的算法進(jìn)行比較,包括DES、3DES、AES和Blowfish等算法,測試結(jié)果如表1所示。
表1 幾種常用的對稱加密算法加解密測試
Blowfish自公布以來,仍未發(fā)現(xiàn)實(shí)際有效的攻擊手段,其算法的子密鑰由算法本身生成,使得加密后數(shù)據(jù)不可辨認(rèn),密鑰分析也極其困難。通過比較,本文在設(shè)計(jì)加密文件系統(tǒng)時(shí)采用Blowfish算法。
3.2 加密算法的實(shí)現(xiàn)
為實(shí)現(xiàn)透明加解密功能,本文以堆疊式文件系統(tǒng)為框架,采用已有成熟算法Blowfish,在內(nèi)核層實(shí)現(xiàn)加密解密操作。
初始化掛載文件系統(tǒng)時(shí),以用戶名,掛載點(diǎn)路徑和用戶輸入密碼為參數(shù),調(diào)用wrapfs_get_encode_pwd產(chǎn)生固定長度序列,調(diào)用該函數(shù)可以把用戶輸入的簡單密碼轉(zhuǎn)化為定長的隨機(jī)序列,避免字典攻擊等暴力破解手段非法獲取密碼。用戶層發(fā)起讀寫請求,陷入內(nèi)核態(tài)后,在內(nèi)核態(tài)內(nèi)存空間處理數(shù)據(jù)后,把密文寫入底層或者把明文返回給用戶空間。
由文獻(xiàn)[8-10]可知,BlowFish算法由兩部分組成,密鑰擴(kuò)展和數(shù)據(jù)加密,密鑰擴(kuò)展用于把密鑰擴(kuò)張到4 168字節(jié)的子密鑰,數(shù)據(jù)加密使用簡單的16輪迭代,主要使用加法運(yùn)算異或運(yùn)算。加密時(shí)通過給定的密鑰key對源密鑰,即通常所說的兩個(gè)固定的“盒”pbox[18]和sbox[4,256]進(jìn)行變換,得到下一步加密信息所需的key_pbox和key_sbox。
BlowFish算法中,有一個(gè)核心加密函數(shù): gBlowFishDeCode。該函數(shù)輸入64位信息,運(yùn)算后,以64位密文的形式輸出[12]。用BlowFish算法加密信息,需要兩個(gè)過程,該算法的加解密流程圖如圖6所示。
圖6 Blowfish文件加密解密流程圖
文件加密過程描述如下:
1) 密鑰預(yù)處理
BlowFish算法的源密鑰——p盒和s盒是固定的[10]。首先得到key,用這個(gè)key對p盒和s盒進(jìn)行變換,得到下一步信息加密所要用的gKeyBoxes。
2) 信息加密
讀入64位數(shù)據(jù),分別獲取其高32位和底32位,操作為xL0 = data64 >> 32;xR0 = data64 & 0x0000 0000ffffffff;然后將xL0與gKeyBoxes進(jìn)行異或操作,保存在XR中,接著調(diào)用gBlowFishFunction(xR) 函數(shù)后與xR0異或保存在XL中。之后xR0 = xR,xL0 = xL,并xL = xR0 ^ gKeyBoxes[0],xR = xL0 ^ gKeyBoxes[1]。最后將二者合并即可得到密文64位。
解密過程簡述如下:
1) 密鑰預(yù)處理
密鑰預(yù)處理的過程與加密時(shí)完全相同。
2) 信息解密
信息解密的過程就是把信息加密過程的gKeyBoxes逆序使用即可。
選取1、2、4到64 MB文件進(jìn)行加密解密測試,得到時(shí)間結(jié)果統(tǒng)計(jì),如圖7所示。加解密時(shí)間基本一致,并且隨文件體積增大而遞增。
圖7 加解密相同類型不同文件大小時(shí)間統(tǒng)計(jì)(blowfish)(緩存1 KB)
測試29.3 MB文件分別以 0.5、1、2到10 KB緩存大小進(jìn)行加解密測試,在一定范圍內(nèi),加密過程較慢,加解密時(shí)間和緩存大小基本無關(guān)。測試結(jié)果如圖8所示。
圖8 緩存大小對算法時(shí)間的統(tǒng)計(jì)(blowfish)
加解密系統(tǒng)無可避免會(huì)損失一部分的性能,加解密過程中的其他操作也會(huì)對時(shí)間產(chǎn)生一定影響。測試結(jié)果表明,本文將加解密過程置于內(nèi)核層中,提高了安全性的同時(shí),對性能損耗基本可以降到用戶接受范圍內(nèi)。
本文提出并實(shí)現(xiàn)一種基于堆疊式文件系統(tǒng)的透明加密、解密系統(tǒng)。以堆疊式文件系統(tǒng)為框架結(jié)合VFS層操作實(shí)現(xiàn)對任意文件類型的加解密操作。使透明加密具有更高的安全等級(jí),更低的性能損失,實(shí)現(xiàn)了兼容性強(qiáng)、對用戶透明、加密速度快和安全性高的加解密文件系統(tǒng)。
[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內(nèi)核源代碼分析[M].機(jī)械工業(yè)出版社,2000.
[6] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2001.
[7] Stevens W R.UNIX環(huán)境高級(jí)編程:英文版[M].機(jī)械工業(yè)出版社,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.密碼編碼學(xué)與網(wǎng)絡(luò)安全:原理與實(shí)踐[M].劉玉珍,王麗娜,傅建明,譯.北京:電子工業(yè)出版社,2006:131-135.
[12] Bruce Schneier.應(yīng)用密碼學(xué):協(xié)議.算法與C源程序[M].2版.機(jī)械工業(yè)出版社,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。江蘇省科技項(xiàng)目-基礎(chǔ)研究計(jì)劃(自然科學(xué)基金:BK20141209);蘇州市應(yīng)用基礎(chǔ)研究項(xiàng)目(SYG 201543)。顏智潤,碩士,主研領(lǐng)域:嵌入式系統(tǒng)設(shè)計(jì),信息安全。李春杰,副研究員。梁會(huì)武,碩士。位珣,碩士。