彭金輝,李橙橙
(鄭州信大捷安移動(dòng)信息安全關(guān)鍵技術(shù)國(guó)家地方聯(lián)合工程實(shí)驗(yàn)室,河南 鄭州 450004)
Windows系統(tǒng)從Vista開(kāi)始采用新的登錄機(jī)制“票據(jù)提供程序”(Credential Provider)[1],相對(duì)于以往Windows XP的登錄機(jī)制“圖形化識(shí)別和驗(yàn)證”(Graphical Identification and Authentication,GINA),Credential Provider安全性高,靈活度大。登錄進(jìn)程使用“身份認(rèn)證包”(Authentication Package)[2]分析登錄數(shù)據(jù),可以通過(guò)添加新的身份認(rèn)證包將新的登錄過(guò)程添加到系統(tǒng)中。本文介紹一種自定義的Windows登錄程序,該程序基于鄭州信大捷安信息技術(shù)股份有限公司(以下簡(jiǎn)稱“信大捷安”)自主研發(fā)的USBKEY,通過(guò)驗(yàn)證PIN碼獲取USBKEY內(nèi)用戶證書使用權(quán)限,再驗(yàn)證用戶證書的真實(shí)性、合法性和有效性。證書能夠證明用戶身份合法有效。PIN碼和證書認(rèn)證可以提高登錄的安全性。相比較僅開(kāi)發(fā)Credential Provider組件而不開(kāi)發(fā)Authentication Package的方案,并存儲(chǔ)用戶名和密碼的自定義登錄方式,本文的解決方案登錄過(guò)程可完全自定義,無(wú)需驗(yàn)證登錄密碼,只保存用戶名即可,可有效避免保存的登錄密碼和實(shí)際不一致而造成系統(tǒng)無(wú)法登錄的情況。
自定義登錄程序中設(shè)計(jì)自定義Credential Provider程序,實(shí)現(xiàn)自定義的UI登錄界面和獲取指定登錄信息,通過(guò)設(shè)置Filter程序指定使用特定的Provider;設(shè)計(jì)自定義Authentication Package,獲取指定登錄信息,驗(yàn)證PIN碼、證書和用戶名信息實(shí)現(xiàn)自定義的身份認(rèn)證;自定義登錄的USBKEY已經(jīng)通過(guò)發(fā)證系統(tǒng)發(fā)過(guò)加密證書和簽名證書[3]。在自定義登錄程序安裝時(shí)將當(dāng)前用戶與USBKEY內(nèi)置簽名證書序列號(hào)建立綁定關(guān)系,數(shù)據(jù)由加密證書公鑰加密之后密文數(shù)據(jù)[4]存入注冊(cè)表。
自定義用戶登錄Windows系統(tǒng)時(shí),先驗(yàn)證用戶PIN口令是否正確,成功之后,讀取注冊(cè)表用戶和證書的綁定密文數(shù)據(jù),用卡內(nèi)加密證書的私鑰進(jìn)行解密[5],比較當(dāng)前用戶和卡內(nèi)簽名證書序列號(hào)是否匹配,成功提交登錄信息,登錄系統(tǒng)。簽名證書作為用戶身份的唯一標(biāo)識(shí),存儲(chǔ)在USBKEY內(nèi),保證登錄過(guò)程的安全性。
Windows登錄機(jī)制的實(shí)現(xiàn)[6]如圖1所示。
圖1 Windows登錄機(jī)制的實(shí)現(xiàn)
當(dāng)系統(tǒng)啟動(dòng)時(shí),Winlogon進(jìn)程開(kāi)始用戶登錄時(shí),首先創(chuàng)建LogonUI進(jìn)程,顯示用戶登錄界面,并與LogonUI進(jìn)程交互,獲取用戶填寫的用戶名等登錄信息。Lsass進(jìn)程負(fù)責(zé)檢查登錄信息的合法性。當(dāng)用戶輸入用戶名等登錄信息并提交登錄時(shí),Winlogon進(jìn)程通過(guò)ALPC與Lsass進(jìn)程交互,確認(rèn)用戶提交登錄信息是否有效。Windows為自定義登錄提供了相應(yīng)的機(jī)制。票據(jù)提供程序(Credential Provider)用來(lái)實(shí)現(xiàn)登錄界面的自定義,認(rèn)證包(Authentication Package)用來(lái)實(shí)現(xiàn)登錄信息驗(yàn)證的自定義。
Windows XP利用GINA機(jī)制來(lái)登錄,從Vista開(kāi)始采用新的登錄機(jī)制,名為Credential Provider[7]。該機(jī)制由兩部分組成:Provider和Filter。Provider和Filter都是實(shí)現(xiàn)了相應(yīng)接口的COM對(duì)象,其在系統(tǒng)中的物理存在形式是dll文件。Provider實(shí)現(xiàn)Icredential Provider Credential和Icredential Provider接口,負(fù)責(zé)用戶登錄界面的顯示和用戶填寫登錄信息的獲取。Filter實(shí)現(xiàn)Icredential Provider Filter接口,負(fù)責(zé)在系統(tǒng)登錄的時(shí)候過(guò)濾Provider,指定使用系統(tǒng)中特定的Provider。
本文自定義Windows登錄程序,通過(guò)Credential Provider設(shè)置自定義登錄界面,替換系統(tǒng)登錄界面,登錄界面包含用戶自定義標(biāo)題圖片、PIN碼輸入框[8]、認(rèn)證按鈕,示例代碼如下:
static const FIELD_STATE_PAIR s_rgFieldStatePairs[] =
{
{
CPFS_DISPLAY_IN_BOTH,
CPFIS_NONE
},
// SFI_TILEIMAGE
{
CPFS_DISPLAY_IN_SELECTED_TILE,
CPFIS_FOCUSED
},
// SFI_PINWORD
{
CPFS_DISPLAY_IN_SELECTED_TILE,
CPFIS_NONE
},
// SFI_SUBMIT_BUTTON
};
static const
CREDENTIAL_PROVIDER_FIELD_DESCRIPTORs_rgCredProvFieldDescriptors[] =
{
{
SFI_TILEIMAGE,
CPFT_TILE_IMAGE,
L"Image",
CPFG_CREDENTIAL_PROVIDER_LOGO
},
{
SFI_PINWORD,
CPFT_PASSWORD_TEXT,
L"請(qǐng)輸入PIN碼"
},
{
SFI_SUBMIT_BUTTON,
CPFT_SUBMIT_BUTTON,
L"Submit"
},
};
設(shè)置UI以后修改GetSerialization函數(shù),在該函數(shù)中提交默認(rèn)用戶名Administrator和PIN碼交由自定義Authentication Package認(rèn)證,認(rèn)證用戶名和PIN碼之后由ReportResult函數(shù)返回驗(yàn)證結(jié)果。驗(yàn)證成功則成功登錄Windows系統(tǒng)。自定義Credential Provider完成以后,編寫Filter功能在函數(shù)里面增加過(guò)濾條件,加載自定義的Credential Provider。
Authentication Package在系統(tǒng)中的物理存在形式是一個(gè)dll文件,其導(dǎo)出若干個(gè)預(yù)定義的函數(shù)。該dll文件由lsass.exe進(jìn)程在系統(tǒng)啟動(dòng)時(shí)加載,提供用戶登錄信息的認(rèn)證服務(wù)。Windows操作系統(tǒng)本身提供了MSV1_0和Kerberos等Authentication Package,另外可以通過(guò)注冊(cè)表配置自定義的Authentication Package,實(shí)現(xiàn)自定義認(rèn)證服務(wù)。
注冊(cè)表路徑:HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaSecurityPackages,值是Authentication Package對(duì)應(yīng)的dll文件名的列表(不包含擴(kuò)展名)。類型是REG_MULTI_SZ,所以列表中的每個(gè)文件名都由一個(gè)空字符(’ 柯坪县| 酒泉市| 通州市| 勃利县| 大化| 平武县| 公主岭市| 高雄县| 星子县| 榆中县| 阿城市| 威海市| 荥经县| 盐池县| 荆门市| 昂仁县| 南涧| 大兴区| 贡山| 油尖旺区| 芜湖市| 永丰县| 安阳市| 固镇县| 邯郸县| 新疆| 东方市| 汨罗市| 海宁市| 开远市| 泗洪县| 锦屏县| 长治市| 鄂州市| 高雄市| 上栗县| 合川市| 哈巴河县| 灵石县| 抚顺市| 普陀区|