顏智潤 李春杰 梁會武 位 珣
(中國科學技術大學蘇州研究院 江蘇 蘇州 215000)
一種透明加解密文件系統的設計與實現
顏智潤 李春杰 梁會武 位 珣
(中國科學技術大學蘇州研究院 江蘇 蘇州 215000)
提升計算機安全性,保護敏感數據成為目前的熱點問題。加密文件系統作為一種數據加密存儲技術可以有效防止非法入侵者竊取用戶機密數據。設計一種基于堆疊式文件系統的安全防護策略,屏蔽了具體文件系統的操作差異,實現透明高效的加密、解密。在不改變用戶使用習慣的前提下添加加密、解密過程,用戶使用時將密文形式存儲的數據解密為明文,加、解密算法以當前較為成熟的Blowfish算法為基礎在內核層完成,并且每個文件擁有獨立密碼,極大增加了破解難度,整體實現性能和易用的平衡。
加密文件系統 信息安全 透明
近年來,計算機安全技術不斷發展成熟,人們對于計算機系統安全問題考慮得越來越多,對于計算機系統的安全性提出了更嚴格的要求。目前國內涉及操作系統的文件加密大部分都是針對在Windows操作系統下的文件加密軟件,針對Linux系統的文件加密產品較少。同時國內外已有的數據文件加密產品普遍存在以下幾個問題:一是可移植性差,大部分都是針對Windows操作系統進行設計和開發,對于Linux環境下的數據安全產品很少;二是效率和性能較差,目前已有的較成熟文件加密系統在安全性、穩定性、可移植性、系統維護便捷性等方面存在一定的不足,在實際應用中難以圓滿完成用戶所期待的任務功能。
本文提出基于Linux的透明文件加密系統是防止存儲數據泄密的產品。該系統在不改變用戶使用習慣和計算機存儲文件格式和狀態的情況下,對文件進行實時、透明的加/解密。保密文件數據在存儲介質中以密文形式存放,對于沒有訪問權限的用戶,即使通過非法手段得到存儲設備,也無法獲取明文信息,所有未經授權的數據,都將以亂碼形式出現。
透明加解密文件系統工作模式如下:

圖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文件系統進行研究、設計。
文件系統架構以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.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逆序使用即可。
選取1、2、4到64 MB文件進行加密解密測試,得到時間結果統計,如圖7所示。加解密時間基本一致,并且隨文件體積增大而遞增。

圖7 加解密相同類型不同文件大小時間統計(blowfish)(緩存1 KB)
測試29.3 MB文件分別以 0.5、1、2到10 KB緩存大小進行加解密測試,在一定范圍內,加密過程較慢,加解密時間和緩存大小基本無關。測試結果如圖8所示。

圖8 緩存大小對算法時間的統計(blowfish)
加解密系統無可避免會損失一部分的性能,加解密過程中的其他操作也會對時間產生一定影響。測試結果表明,本文將加解密過程置于內核層中,提高了安全性的同時,對性能損耗基本可以降到用戶接受范圍內。
本文提出并實現一種基于堆疊式文件系統的透明加密、解密系統。以堆疊式文件系統為框架結合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)。顏智潤,碩士,主研領域:嵌入式系統設計,信息安全。李春杰,副研究員。梁會武,碩士。位珣,碩士。