摘 要: 目前多數安全USB設備使用時,需要開啟一個應用程序界面來對USB設備進行讀寫、加密/解密。對此,提出并實現了一種利用硬件PNP技術自動對USB映射為本地盤符,拔下時自動刪除盤符的技術。讀寫文件時,對USB設備自動透明加解密;安全U盤使用前經過授權中心統一注冊與授權,劃分為權限注冊區(qū)和加密區(qū);用戶密碼驗證采用基于密碼的密碼系統說明書(RFC2898)和應用偽隨機函數導出密鑰(PBKDF2);權限管理采用預先設定好的內、外網策略,內網策略分為多個等級。在實際應用中取得了較好效果。
關鍵詞: 移動存儲;加解密;卷映射;硬件插拔
大多數普通安全U盤通過使用軟件實現安全U盤加密功能。在使用過程中,用戶需要打開專用的U盤瀏覽器或管理工具等,不但操作不方便,而且不符合USB設備使用習慣和人性化設計。
本文通過對驅動層硬件插拔(PNP)的研究,在用戶接上USB等存儲設備時,在卷過濾驅動層判斷符合卷格式的USB設備時,如果符合規(guī)定的卷格式和標識,則對U盤自動卷映射(mount)為本地磁盤,對U盤的讀寫操作如同操作本地盤,即在寫入文件時自動加密,讀文件時自動解密,對卷映射的本地磁盤盤符的讀寫,實際是對U盤上加密數據的讀寫。
在分析了Windows DDK/FSD驅動開發(fā)技術、卷上過濾驅動技術,提出了在Windows系統插入USB設備時,自動掛載符合規(guī)定卷格式的USB設備,映射為本地磁盤,根據注冊信息和本機是否在內網,應用相應的策略,對USB設備進行可讀、可寫、禁用等措施;在加解密方面,應用基于密碼的密碼系統說明書(RFC2898)和應用偽隨機函數導出密鑰(PBKDF2)等標準,保證了數據的安全存儲。
1 原理與架構
系統分為驅動層和應用層,驅動層包括一個卷過濾驅動程序和一個文件系統過濾驅動;應用層包括一個應用程序和與驅動交互的dll。應用層是隱藏界面的應用程序。卷過濾驅動對USB盤的(PNP)動作識別,讀移動硬盤卷的頭為512 B,對特定標識識別,如果不符合卷標示,則可采用禁用或放行等;如果符合卷格式和標識,則對此卷進行映射。USB盤上數據采用透明加解密方法。
普通U盤使用前需要格式化,物理U盤上的數據是隨機的數值。密碼算法采用基于口令的密碼系統 (RFC2898),口令和鹽(salt)結合產生密鑰。鹽可看作是對口令導出的一個大密鑰集合的索引。鹽和迭代次數構成了PKCS#5v1.5中基于口令加密基礎。系統總體架構序列圖如圖1所示。
加密算法可采用AES-256、Serpent、Twofish等,解密時通過判斷廠商標識以及CRC-32校驗和是否正確,在此過程中在權限注冊區(qū)讀入相應的注冊信息,如GUID和廠商標識等。如上述過程正確,則執(zhí)行正確的卷映射過程。
2 研究與實現
系統應用層主要由三個線程組成,主線程是應用程序,剩下卷映射線程和卸下卷(unmount)線程分別用來在USB存儲設備做PNP時對本地盤進行卷映射和卸下卷。線程和驅動層采用事件通信機制。本系統定位于移動存儲設備,包括移動硬盤、U盤及移動存儲卡等移動存儲介質??梢詫⒂脩舻钠胀║SB存儲設備分為密文區(qū)與權限注冊區(qū)兩個存區(qū)。密文區(qū)是從內部可信計算機拷貝數據到USB存儲設備,數據在后臺加密處理后存放的區(qū)域;權限注冊區(qū)則寫入GUID和必要的廠商、運行權限、內外網策略等。
卷映射線程收到底層USB的PNP動作時,首先得到運行環(huán)境,根據運行環(huán)境得到USB存儲設備讀寫權限,然后根據相關密碼、密鑰等參數通過DEVICEIOCONTROL通知驅動創(chuàng)建本地虛擬盤,最后廣播DBT_DEVICEARRIVAL消息通知操作系統。卸下卷線程收到USB存儲設備拔出事件通知后,將盤符參數下發(fā)到驅動層,對盤符做卸下卷操作,同時清理相關資源,發(fā)送廣播消息(DBT_DEVICEREMOVEPENDING)消息。
集中注冊與授權,使用前必須經過授權中心統一注冊與授權,包括格式化、實名注冊、標識密級、指定授權計算機、是否采用口令保護等。授權后的移動存儲介質在涉密計算機上能正常使用,當未授權的移動存儲設備接入計算機時,系統可自動關閉USB端口,使未授權移動存儲介質無法在涉密計算機上使用。采用透明加密技術實現讀寫數據自動加解密。
對于正確安裝了移動存儲安全系統客戶端的計算機,客戶端自動上報該機狀態(tài),完成到控制臺服務器注冊功能,有效防止非法用戶安裝客戶端程序。靈活的注冊策略,可設定移動存儲介質允許的計算機或組;管理員可隨時更改移動存儲介質注冊策略和信息,包括遠程策略變更、掛失和注銷等;外出拷貝功能是將COPY到U盤內安全存儲的數據與外界沒有安裝客戶端程序的計算機進行數據交互使用,非法外聯監(jiān)控;審計功能包括詳細審計記錄(如注冊信息、使用信息和文件操作信息),記錄要素包括使用人、使用的計算機、使用時間和動作等。
應用層完成對移動存儲設備的格式化工作。對卷起始位置寫入密碼、校驗和等信息,提供了FAT32和NTFS兩種文件系統格式。在驅動中對移動存儲設備做卷映射,創(chuàng)建類型為FILE_DEVICE_DISK卷過濾驅動,使用不同的盤符。在IRP_MJ_WRITE和IRP_MJ_READ請求例程中進行加解密。在IRP_MJ_WRITE分發(fā)例程中把相關的IRP存入隊列。在新創(chuàng)建的系統線程內進行卷加密。在IRP_MJ_READ中進行解密。
注冊主要由應用層注冊工具完成,可由用戶選擇FAT32或NTFS格式。注冊流程如下:訪問移動存儲盤,輸入需要注冊信息。注冊信息包括:移動存儲盤密碼、標簽名、安全等級、客戶標識名、分區(qū)個數、內網移動存儲策略、外網移動存儲策略、1~5等級的移動存儲策略(是否啟用保密區(qū)、是否啟用交換區(qū),不同分區(qū)間操作控制)。然后寫入移動存儲密碼和相關注冊信息,使用IOCTL向移動存儲介質寫入相應的控制權限信息。
插入安全U盤后,得到處理環(huán)境信息:是否為有效設備、是否有客戶端代理、客戶標識匹配、在內網否、安全等級是否1~5,然后決定應用不同策略。驅動只要掛載存儲卷的UpperFilter即可完成卷的加解密任務。
卷過濾驅動在IRP_MJ_PNP請求時監(jiān)控設備的插拔消息,程序判斷是否是指定的卷格式,如發(fā)現是移動存儲設備,則用DeviceIoControl與驅動層通信。通過對新加卷的監(jiān)控,實現對移動存儲設備的加解密。應用層通過DeviceIoControl與應用層的通信獲得用戶密鑰和權限策略。
在文件系統驅動層映射卷的流程如下:應用程序調用ZwCreateFile或IoCreateFileSpecifyDeviceObjectHint,I/O管理器確定請求的目標是哪個邏輯卷,檢查是否設置了VPB_MOUNTED。如此卷在系統引導后未被卷映射,則I/O管理器發(fā)送卷映射請求(IRP_MN_MOUNT_VOLUME)。
每個文件系統接收到卷映射卷請求后,檢查卷引導扇區(qū)確認是否是正確的卷格式、卷是否為指定的文件系統格式化的。如果卷格式符合,文件系統則卷映射該卷。
對移動存儲設備的格式化可分為FAT32和NTFS兩種格式。卷過濾驅動監(jiān)控系統的PNP行為,如移動介質頭512 B符合卷頭格式,則使用事件通知應用層對移動介質卷映射,卷映射線程將相關參數(盤符、密碼、磁盤屬性)等傳遞到文件系統驅動,創(chuàng)建一個FILE_DEVICE_DISK類型的過濾設備;然后創(chuàng)建一個線程,在線程中應用ZwCreateFile打開卷設備Handle,讀取卷頭信息,對卷頭信息進行驗證,如驗證卷頭信息成功,則創(chuàng)建相應盤符的符號鏈接;對USB設備加密模式為XTS;卸下卷線程接到拔下USB存儲器通知事件后,對相應盤符進行卸載,清理相關資源。
應用層包括對卷格式化功能,對移動USB設備合法性驗證、得到USB運行環(huán)境信息、根據策略信息對USB設備進行讀寫、禁用等控制。在USB設備上單開辟一個區(qū)域,用來存取注冊信息以及寫入注冊信息和讀取注冊信息,生成GUID寫入USB設備的唯一標示,完成卷映射功能。
安全U盤總體設計序列圖如圖2所示。
在PNP發(fā)生時,驅動層和應用層通過事件進行通信。對卷映射和卸下卷過程各啟動一個線程等待PNP事件發(fā)生。首先驗證卷頭格式,卷頭信息讀到RAM中。卷頭64 B是生成密鑰所需的鹽(salt),驅動層解密讀入的標準卷頭、解密過程中的所有數據保存在RAM中。在此過程中需要得到如下參數:
卷頭導出函數用的PRF參數(見PKCS #5 v2.0)可為:HMAC-SHA-512、HMAC_RIPEMD-160等;廠商標示密碼和讀入的鹽值傳給卷頭密鑰導出函數,生成頭解密密鑰和扇區(qū)解密密鑰;使用的加密算法為AES-256;解密時對照廠商標示密碼及校驗和,密鑰用來解密卷上的扇區(qū)。
主要數據結構和參數如下:
(1)卷映射數據結構
typedef struct
{
Int nReturnCode; //底層sys返回碼
Short wszHsVolume[MAX_PATH]; //卷名稱
Password VolumePassword; //用戶密碼
BOOL bCache;//是否在驅動中緩存密碼
Int nDosDriveNo; //需要卷映射的盤符號
Int BytesPerSector; //扇區(qū)字節(jié)數
BOOL bSystemVolume; //是否為系統卷
BOOL bPersistenVolume; //是否為隱藏卷
BOOL bMountReadOnly;//是否映射為隱藏卷格式
BOOL bMountRemovable;//是否映射為可移動
//存儲設備
} MOUNT_STRUCT;
(2)設備信息結構
typedef struct _SECDEVICEINFO
{
CHAR szProvider[SD_MAX_PROVIDER_LEN];
//設備提供者名稱
DWORD dwDeviceType; //設備類型
CHAR szDeviceID[SD_MAX_DEVICE_ID_LEN];
//設備唯一標識
__int64 dwDeviceCapacity; //設備容量
} SECDEVICEINFO, *PSECDEVICEINFO;
(3)策略數據結構
typedef struct _POLICYDATA
{
BOOL bEnableSecPart; //是否啟動保密區(qū)
BOOL bReadSecPart; //是否可讀保密區(qū)
BOOL bWriteSecPart; //是否可寫保密區(qū)
BOOL bEncryptSecPart; //是否加密保密區(qū)
BOOL bEnableExchPart; //是否啟用交換區(qū)
BOOL bReadExchPart; //是否可讀交換區(qū)
BOOL bWriteExchPart; //是否可寫交換區(qū)
BOOL bEncryptExchPart; //是否加密交換區(qū)
BOOL bExchPartToSecPart;
//是否允許從交換區(qū)復制到保密區(qū)
BOOL bsechPartToSecPart;
//是否允許從保密區(qū)復制到交換機
} POLICYDATA,*PPOLICYDATA;
應用層創(chuàng)建雙線程,等待PNP消息,如接入USB盤符和特定卷格式,則對卷做相應卷映射和卸下卷。
對卷卷映射函數:
Int MountVolume (
int driveNo,
char *volumePath,
Password *password,
MountOptions *mountOptions,
BOOL bReportWrongPassword );
對卷卸下卷函數:
BOOL UnmountVolume
(int nDosDriveNo, BOOL forceUnmount );
創(chuàng)建內存中卷格式:
int VolumeWriteHeader(char*header,int ea,int mode,Password* password,
char*masterKey,
PCRYPTO_INFO*retInfo,
BOOL bWipeMode );
讀入USB卷頭:
int VolumeReadHeader(char*encryptedHeader,Password);
經過測試人員測試和客戶現場應用,本系統達到了良好的應用效果,從驅動層到應用層都運行良好。系統支持FAT32和NTFS格式,對容量較大的USB移動存儲設備和容量較小的U盤都有較好的使用和保密效果。
參考文獻
[1] 胡曉軍.開發(fā)WDM型USB設備客戶驅動程序[J].中國數據通信,2002(2):51-53.
[2] RUSSINOVICH M E, SOLOMON D A. 深入解析Windows操作系統[M].第4版.潘愛民,譯.北京:電子工業(yè)出版社,2008.