大多數(shù)普通安全U盤通過(guò)使用軟件實(shí)現(xiàn)安全U盤加密功能。在使用過(guò)程中,用戶需要打開(kāi)專用的U盤瀏覽器或管理工具等,不但操作不方便,而且不符合USB設(shè)備使用習(xí)慣和人性化設(shè)計(jì)。
本文通過(guò)對(duì)驅(qū)動(dòng)層硬件插拔(PNP)的研究,PNP是由Microsoft提出的,英文Plug and play的縮寫(xiě),中譯即插即用,意思是系統(tǒng)自動(dòng)偵測(cè)周邊設(shè)備和板卡并自動(dòng)安裝設(shè)備驅(qū)動(dòng)程序,作到插上就能用,無(wú)須人工干預(yù),是Windows自帶的一項(xiàng)技術(shù)。所謂即插即用是指將符合PNP標(biāo)準(zhǔn)的PC插卡等外圍設(shè)備安裝到電腦時(shí),操作系統(tǒng)自動(dòng)設(shè)定系統(tǒng)結(jié)構(gòu)的技術(shù)。這就是說(shuō),當(dāng)用戶安裝新的硬件時(shí),不必再設(shè)置任何跳線器開(kāi)關(guān),也不必用軟件配置中斷請(qǐng)求(IRQ)、內(nèi)存地址或直接存儲(chǔ)器存取(DMA)通道,Windows會(huì)向應(yīng)用程序通知硬件設(shè)備的新變化,并會(huì)自動(dòng)協(xié)調(diào)IRQ、內(nèi)存地址和DMA通道之間的沖突。
在分析了Windows DDK/FSD驅(qū)動(dòng)開(kāi)發(fā)技術(shù)、卷上過(guò)濾驅(qū)動(dòng)技術(shù),提出了在Windows系統(tǒng)插入U(xiǎn)SB設(shè)備時(shí),自動(dòng)掛載符合規(guī)定卷格式的USB設(shè)備,映射為本地磁盤,USB(Universal Serial Bus)即“通用串行總線”是一種應(yīng)用在計(jì)算機(jī)領(lǐng)域的新型接口技術(shù)。USB的拓?fù)浣Y(jié)構(gòu)中居于核心地位的是Host(也稱為主機(jī))。任何一次USB的數(shù)據(jù)傳輸都必須由主機(jī)來(lái)發(fā)起和控制,所有的USB外設(shè)都只能和主機(jī)建立連接,任何兩個(gè)外設(shè)之間或是兩個(gè)主機(jī)之間無(wú)法直接通信。而目前,大量的扮演主機(jī)角色的是個(gè)人電腦PC。隨著USB應(yīng)用領(lǐng)域的逐漸擴(kuò)大,對(duì)于USB的期望也越來(lái)越高。我們希望USB能應(yīng)用在各種計(jì)算機(jī)領(lǐng)域中,希望能通過(guò)PDA等移動(dòng)設(shè)備直接和USB外設(shè)通信,使得USB能應(yīng)用在沒(méi)有PC的領(lǐng)域中。
1 原理與架構(gòu)
系統(tǒng)分為驅(qū)動(dòng)層和應(yīng)用層,驅(qū)動(dòng)層包括一個(gè)卷過(guò)濾驅(qū)動(dòng)程序和一個(gè)文件系統(tǒng)過(guò)濾驅(qū)動(dòng);應(yīng)用層包括一個(gè)應(yīng)用程序和與驅(qū)動(dòng)交互的dll。應(yīng)用層是隱藏界面的應(yīng)用程序。卷過(guò)濾驅(qū)動(dòng)對(duì)USB盤的(PNP)動(dòng)作識(shí)別,讀移動(dòng)硬盤卷的頭為512 B,對(duì)特定標(biāo)識(shí)識(shí)別,如果不符合卷標(biāo)示,則可采用禁用或放行等;如果符合卷格式和標(biāo)識(shí),則對(duì)此卷進(jìn)行映射。
普通U盤使用前需要格式化,物理U盤上的數(shù)據(jù)是隨機(jī)的數(shù)值。密碼算法采用基于口令的密碼系統(tǒng) (RFC2898),口令和鹽(salt)結(jié)合產(chǎn)生密鑰。鹽可看作是對(duì)口令導(dǎo)出的一個(gè)大密鑰集合的索引。鹽和迭代次數(shù)構(gòu)成了PKCS#5v1.5中基于口令加密基礎(chǔ)。系統(tǒng)總體架構(gòu)序列圖如圖1所示。
加密算法可采用AES-256、Serpent、Twofish等,解密時(shí)通過(guò)判斷廠商標(biāo)識(shí)以及CRC-32校驗(yàn)和是否正確,在此過(guò)程中在權(quán)限注冊(cè)區(qū)讀入相應(yīng)的注冊(cè)信息,如GUID和廠商標(biāo)識(shí)等。如上述過(guò)程正確,則執(zhí)行正確的卷映射過(guò)程。
2 研究與實(shí)現(xiàn)
系統(tǒng)應(yīng)用層主要由三個(gè)線程組成,主線程是應(yīng)用程序,剩下卷映射線程和卸下卷(unmount)線程分別用來(lái)在USB存儲(chǔ)設(shè)備做PNP時(shí)對(duì)本地盤進(jìn)行卷映射和卸下卷。線程和驅(qū)動(dòng)層采用事件通信機(jī)制。本系統(tǒng)定位于移動(dòng)存儲(chǔ)設(shè)備,包括移動(dòng)硬盤、U盤及移動(dòng)存儲(chǔ)卡等移動(dòng)存儲(chǔ)介質(zhì)。密文區(qū)是從內(nèi)部可信計(jì)算機(jī)拷貝數(shù)據(jù)到USB存儲(chǔ)設(shè)備,數(shù)據(jù)在后臺(tái)加密處理后存放的區(qū)域;權(quán)限注冊(cè)區(qū)則寫(xiě)入GUID和必要的廠商、運(yùn)行權(quán)限、內(nèi)外網(wǎng)策略等。
卷映射線程收到底層USB的PNP動(dòng)作時(shí),首先得到運(yùn)行環(huán)境,根據(jù)運(yùn)行環(huán)境得到USB存儲(chǔ)設(shè)備讀寫(xiě)權(quán)限,然后根據(jù)相關(guān)密碼、密鑰等參數(shù)通過(guò)DEVICEIOCONTROL通知驅(qū)動(dòng)創(chuàng)建本地虛擬盤,最后廣播DBT_DEVICEARRIVAL消息通知操作系統(tǒng)。
集中注冊(cè)與授權(quán),使用前必須經(jīng)過(guò)授權(quán)中心統(tǒng)一注冊(cè)與授權(quán),包括格式化、實(shí)名注冊(cè)、標(biāo)識(shí)密級(jí)、指定授權(quán)計(jì)算機(jī)、是否采用口令保護(hù)等。授權(quán)后的移動(dòng)存儲(chǔ)介質(zhì)在涉密計(jì)算機(jī)上能正常使用,當(dāng)未授權(quán)的移動(dòng)存儲(chǔ)設(shè)備接入計(jì)算機(jī)時(shí),系統(tǒng)可自動(dòng)關(guān)閉USB端口,使未授權(quán)移動(dòng)存儲(chǔ)介質(zhì)無(wú)法在涉密計(jì)算機(jī)上使用。
對(duì)于正確安裝了移動(dòng)存儲(chǔ)安全系統(tǒng)客戶端的計(jì)算機(jī),客戶端自動(dòng)上報(bào)該機(jī)狀態(tài),完成到控制臺(tái)服務(wù)器注冊(cè)功能,有效防止非法用戶安裝客戶端程序。靈活的注冊(cè)策略,可設(shè)定移動(dòng)存儲(chǔ)介質(zhì)允許的計(jì)算機(jī)或組;管理員可隨時(shí)更改移動(dòng)存儲(chǔ)介質(zhì)注冊(cè)策略和信息,包括遠(yuǎn)程策略變更、掛失和注銷等;外出拷貝功能是將COPY到U盤內(nèi)安全存儲(chǔ)的數(shù)據(jù)與外界沒(méi)有安裝客戶端程序的計(jì)算機(jī)進(jìn)行數(shù)據(jù)交互使用。
應(yīng)用層完成對(duì)移動(dòng)存儲(chǔ)設(shè)備的格式化工作。對(duì)卷起始位置寫(xiě)入密碼、校驗(yàn)和等信息,提供了FAT32和NTFS兩種文件系統(tǒng)格式。在驅(qū)動(dòng)中對(duì)移動(dòng)存儲(chǔ)設(shè)備做卷映射,創(chuàng)建類型為FILE_DEVICE_DISK卷過(guò)濾驅(qū)動(dòng),使用不同的盤符。在IRP_MJ_WRITE和IRP_MJ_READ請(qǐng)求例程中進(jìn)行加解密。在IRP_MJ_WRITE分發(fā)例程中把相關(guān)的IRP存入隊(duì)列。在新創(chuàng)建的系統(tǒng)線程內(nèi)進(jìn)行卷加密。在IRP_MJ_READ中進(jìn)行解密。
注冊(cè)主要由應(yīng)用層注冊(cè)工具完成,可由用戶選擇FAT32或NTFS格式。注冊(cè)流程如下:訪問(wèn)移動(dòng)存儲(chǔ)盤,輸入需要注冊(cè)信息。注冊(cè)信息包括:移動(dòng)存儲(chǔ)盤密碼、標(biāo)簽名、安全等級(jí)、客戶標(biāo)識(shí)名、分區(qū)個(gè)數(shù)、內(nèi)網(wǎng)移動(dòng)存儲(chǔ)策略、外網(wǎng)移動(dòng)存儲(chǔ)策略、1~5等級(jí)的移動(dòng)存儲(chǔ)策略。
插入安全U盤后,得到處理環(huán)境信息:是否為有效設(shè)備、是否有客戶端代理、客戶標(biāo)識(shí)匹配、在內(nèi)網(wǎng)否、安全等級(jí)是否1~5,然后決定應(yīng)用不同策略。驅(qū)動(dòng)只要掛載存儲(chǔ)卷的UpperFilter即可完成卷的加解密任務(wù)。
在PnP技術(shù)出現(xiàn)之前,中斷和I/O端口的分配是由人手工進(jìn)行的,您想要這塊聲卡占用中斷5,就找一個(gè)小跳線在卡上標(biāo)著中斷5的針腳上一插。這樣的操作需要用戶了解中斷和I/O端口的知識(shí),并且能夠自己分配中斷地址而不發(fā)生沖突,對(duì)普通用戶提出這樣的要求是不切實(shí)際的。PnP技術(shù)就是用來(lái)解決這個(gè)問(wèn)題的,PnP技術(shù)將自動(dòng)找到一個(gè)不沖突的中斷和I/O地址分配給外部設(shè)備,而完全不需要人工干預(yù)。但是如果您讀懂了上面關(guān)于中斷沖突的那一部分,您就應(yīng)該了解,在中斷資源非常緊張的今天,即使是PnP技術(shù),也不一定能找到一個(gè)合適的中斷分配給您剛剛插入的設(shè)備,所以盡量釋放那些沒(méi)有必要的中斷,對(duì)PnP正常工作也是很有幫助的。
卷過(guò)濾驅(qū)動(dòng)在IRP_MJ_PNP請(qǐng)求時(shí)監(jiān)控設(shè)備的插拔消息,程序判斷是否是指定的卷格式,如發(fā)現(xiàn)是移動(dòng)存儲(chǔ)設(shè)備,則用DeviceIoControl與驅(qū)動(dòng)層通信。通過(guò)對(duì)新加卷的監(jiān)控,實(shí)現(xiàn)對(duì)移動(dòng)存儲(chǔ)設(shè)備的加解密。應(yīng)用層通過(guò)DeviceIoControl與應(yīng)用層的通信獲得用戶密鑰和權(quán)限策略。
在文件系統(tǒng)驅(qū)動(dòng)層映射卷的流程如下:應(yīng)用程序調(diào)用ZwCreateFile或IoCreateFileSpecifyDeviceObjectHint,I/O管理器確定請(qǐng)求的目標(biāo)是哪個(gè)邏輯卷,檢查是否設(shè)置了VPB_MOUNTED。如此卷在系統(tǒng)引導(dǎo)后未被卷映射,則I/O管理器發(fā)送卷映射請(qǐng)求(IRP_MN_MOUNT_VOLUME)。
對(duì)移動(dòng)存儲(chǔ)設(shè)備的格式化可分為FAT32和NTFS兩種格式。卷過(guò)濾驅(qū)動(dòng)監(jiān)控系統(tǒng)的PNP行為,如移動(dòng)介質(zhì)頭512 B符合卷頭格式,則使用事件通知應(yīng)用層對(duì)移動(dòng)介質(zhì)卷映射,卷映射線程將相關(guān)參數(shù)(盤符、密碼、磁盤屬性)等傳遞到文件系統(tǒng)驅(qū)動(dòng),創(chuàng)建一個(gè)FILE_DEVICE_DISK類型的過(guò)濾設(shè)備;然后創(chuàng)建一個(gè)線程,在線程中應(yīng)用ZwCreateFile打開(kāi)卷設(shè)備Handle,讀取卷頭信息,對(duì)卷頭信息進(jìn)行驗(yàn)證,如驗(yàn)證卷頭信息成功,則創(chuàng)建相應(yīng)盤符的符號(hào)鏈接;對(duì)USB設(shè)備加密模式為XTS;卸下卷線程接到拔下USB存儲(chǔ)器通知事件后,對(duì)相應(yīng)盤符進(jìn)行卸載,清理相關(guān)資源。
應(yīng)用層包括對(duì)卷格式化功能,對(duì)移動(dòng)USB設(shè)備合法性驗(yàn)證、得到USB運(yùn)行環(huán)境信息、根據(jù)策略信息對(duì)USB設(shè)備進(jìn)行讀寫(xiě)、禁用等控制。在USB設(shè)備上單開(kāi)辟一個(gè)區(qū)域,用來(lái)存取注冊(cè)信息以及寫(xiě)入注冊(cè)信息和讀取注冊(cè)信息,生成GUID寫(xiě)入U(xiǎn)SB設(shè)備的唯一標(biāo)示,完成卷映射功能。
安全U盤總體設(shè)計(jì)序列圖如圖2所示。
在PNP發(fā)生時(shí),驅(qū)動(dòng)層和應(yīng)用層通過(guò)事件進(jìn)行通信。對(duì)卷映射和卸下卷過(guò)程各啟動(dòng)一個(gè)線程等待PNP事件發(fā)生。首先驗(yàn)證卷頭格式,卷頭信息讀到RAM中。卷頭64 B是生成密鑰所需的鹽(salt),驅(qū)動(dòng)層解密讀入的標(biāo)準(zhǔn)卷頭、解密過(guò)程中的所有數(shù)據(jù)保存在RAM中。在此過(guò)程中需要得到如下參數(shù):
卷頭導(dǎo)出函數(shù)用的PRF參數(shù)(見(jiàn)PKCS #5 v2.0)可為:HMAC-SHA-512、HMAC_RIPEMD-160等;廠商標(biāo)示密碼和讀入的鹽值傳給卷頭密鑰導(dǎo)出函數(shù),生成頭解密密鑰和扇區(qū)解密密鑰;使用的加密算法為AES-256;解密時(shí)對(duì)照廠商標(biāo)示密碼及校驗(yàn)和,密鑰用來(lái)解密卷上的扇區(qū)。
主要數(shù)據(jù)結(jié)構(gòu)和參數(shù)如下:
(1)卷映射數(shù)據(jù)結(jié)構(gòu)
typedef struct
{
Int nReturnCode; //底層sys返回碼
Short wszHsVolume[MAX_PATH]; //卷名稱
Password VolumePassword; //用戶密碼
BOOL bCache;//是否在驅(qū)動(dòng)中緩存密碼
Int nDosDriveNo; //需要卷映射的盤符號(hào)
Int BytesPerSector; //扇區(qū)字節(jié)數(shù)
BOOL bSystemVolume; //是否為系統(tǒng)卷
BOOL bPersistenVolume; //是否為隱藏卷
BOOL bMountReadOnly;//是否映射為隱藏卷格式
BOOL bMountRemovable;//是否映射為可移動(dòng)
//存儲(chǔ)設(shè)備
} MOUNT_STRUCT;
(2)設(shè)備信息結(jié)構(gòu)
typedef struct _SECDEVICEINFO
{
CHAR szProvider[SD_MAX_PROVIDER_LEN];
//設(shè)備提供者名稱
DWORD dwDeviceType; //設(shè)備類型
CHAR szDeviceID[SD_MAX_DEVICE_ID_LEN];
//設(shè)備唯一標(biāo)識(shí)
__int64 dwDeviceCapacity; //設(shè)備容量
} SECDEVICEINFO, *PSECDEVICEINFO;
(3)策略數(shù)據(jù)結(jié)構(gòu)
typedef struct _POLICYDATA
{
BOOL bEnableSecPart; //是否啟動(dòng)保密區(qū)
BOOL bReadSecPart; //是否可讀保密區(qū)
BOOL bWriteSecPart; //是否可寫(xiě)保密區(qū)
BOOL bEncryptSecPart; //是否加密保密區(qū)
BOOL bEnableExchPart; //是否啟用交換區(qū)
BOOL bReadExchPart; //是否可讀交換區(qū)
BOOL bWriteExchPart; //是否可寫(xiě)交換區(qū)
BOOL bEncryptExchPart; //是否加密交換區(qū)
BOOL bExchPartToSecPart;
//是否允許從交換區(qū)復(fù)制到保密區(qū)
BOOL bsechPartToSecPart;
//是否允許從保密區(qū)復(fù)制到交換機(jī)
} POLICYDATA,*PPOLICYDATA;
應(yīng)用層創(chuàng)建雙線程,等待PNP消息,如接入U(xiǎn)SB盤符和特定卷格式,則對(duì)卷做相應(yīng)卷映射和卸下卷。
對(duì)卷卷映射函數(shù):
Int MountVolume (
int driveNo,
char *volumePath,
Password *password,
MountOptions *mountOptions,
BOOL bReportWrongPassword );
對(duì)卷卸下卷函數(shù):
BOOL UnmountVolume
(int nDosDriveNo, BOOL forceUnmount );
創(chuàng)建內(nèi)存中卷格式:
int VolumeWriteHeader(char*header,int ea,int mode,Password* password,
char*masterKey,
PCRYPTO_INFO*retInfo,
BOOL bWipeMode );
讀入U(xiǎn)SB卷頭:
int VolumeReadHeader(char*encryptedHeader,Password);
經(jīng)過(guò)測(cè)試人員測(cè)試和客戶現(xiàn)場(chǎng)應(yīng)用,本系統(tǒng)達(dá)到了良好的應(yīng)用效果,從驅(qū)動(dòng)層到應(yīng)用層都運(yùn)行良好。系統(tǒng)支持FAT32和NTFS格式,對(duì)容量較大的USB移動(dòng)存儲(chǔ)設(shè)備和容量較小的U盤都有較好的使用和保密果。WINDOWS NT則更進(jìn)一步,它可以檢測(cè)出SCSI設(shè)備及其他一些硬件,到了WINDOWS95/98,則幾乎可以實(shí)現(xiàn)全自動(dòng)的安裝和系統(tǒng)的動(dòng)態(tài)重配置。盡管WINDOWS95不可能對(duì)所有舊設(shè)備都能正確地識(shí)別,甚至有時(shí)也會(huì)求助于用戶,但就即插即用本身而言,這已經(jīng)是一個(gè)真正的飛躍了。現(xiàn)在的WIDNOWS98/2000在PNP方面又得到進(jìn)一步的發(fā)展。
-
usb
+關(guān)注
關(guān)注
60文章
8158瀏覽量
271746 -
WINDOWS
+關(guān)注
關(guān)注
4文章
3610瀏覽量
91187 -
電腦
+關(guān)注
關(guān)注
16文章
1777瀏覽量
70089
發(fā)布評(píng)論請(qǐng)先 登錄
ESP32-S2重復(fù)插拔USB,會(huì)導(dǎo)致USB驅(qū)動(dòng)崩潰怎么處理?
基于USB數(shù)據(jù)采集系統(tǒng)的研究與設(shè)計(jì)--ResearchandDesignofDataAequisitio
通過(guò)USBN9603/P89C51平臺(tái)實(shí)現(xiàn)USB接口硬件加密
如何通過(guò)硬件實(shí)現(xiàn)安全CAN通信網(wǎng)絡(luò)的方式
怎么通知應(yīng)用層cp2102芯片的熱插拔狀態(tài)?
USB轉(zhuǎn)串口熱插拔無(wú)法實(shí)現(xiàn)是為什么?
重復(fù)插拔USB有時(shí)候會(huì)導(dǎo)致USB驅(qū)動(dòng)崩潰要怎么處理?
安全刪除USB設(shè)備的軟件

ZigBee的MAC層安全研究
嵌入式Linux下可插拔輸入驅(qū)動(dòng)機(jī)制研究
WinCE_Net系統(tǒng)下USB總線驅(qū)動(dòng)程序實(shí)現(xiàn)的研究

詳細(xì)介紹Linux USB驅(qū)動(dòng)工作流程

如何使用51單片機(jī)控制SL811HS實(shí)現(xiàn)USB主機(jī)的硬件設(shè)計(jì)和底層驅(qū)動(dòng)的編寫(xiě)

MOSFET 安全工作區(qū)對(duì)實(shí)現(xiàn)穩(wěn)固熱插拔應(yīng)用的意義所在

評(píng)論