桂兵祥
(武漢工業(yè)學(xué)院計(jì)算機(jī)與信息工程系,湖北武漢 430023)
NTLM是一個(gè)身份鑒別協(xié)議[1],由 NTLMSSP(NTLM Security Support Provider)支持,主要應(yīng)用于不同的微軟網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)中。其早期應(yīng)用于 DCE/RPC的安全鑒別與協(xié)商,其還作為一個(gè)單一簽名機(jī)制整合于無(wú)處不在的微軟系統(tǒng)中。其使用了基于挑戰(zhàn) -響應(yīng)機(jī)制的鑒別方法,該機(jī)制中,客戶端能在不發(fā)送用戶密碼給服務(wù)器的情況下就能實(shí)現(xiàn)用戶的身份鑒別,其通常由協(xié)商 (negotiation)、挑戰(zhàn) (challenge)和鑒別 (authentication)三類消息組成。
NTLM是一個(gè)身份鑒別機(jī)制,其基本原理如圖1所示。
第一步:客戶端首先創(chuàng)建并發(fā)送第一類消息(協(xié)商 negotiation)給服務(wù)器,該消息中主要包含服務(wù)器端所要求的客戶端的特征列表。
第二步:服務(wù)器接收并分析該消息,然后創(chuàng)建第二類消息 (挑戰(zhàn) challenge)并發(fā)往客戶端,以此與客戶端建立協(xié)商,并對(duì)之提出挑戰(zhàn),其可能隨意性地包含鑒別對(duì)象特征列表中的一些信息。
第三步:客戶端創(chuàng)建第三類消息 (鑒別 authentication)對(duì)第二類挑戰(zhàn)消息做出響應(yīng),以實(shí)現(xiàn)鑒別功能,該消息不用直接發(fā)送密碼也能顯示出客戶端特定的身份信息。
圖1 挑戰(zhàn)響應(yīng)機(jī)制原理示意圖
對(duì)于服務(wù)器發(fā)來(lái)的挑戰(zhàn),客戶端可以創(chuàng)建一個(gè)或多個(gè)響應(yīng)消息,這些響應(yīng)消息共分以下五類:①LM(LAN Manager)響應(yīng)——大多數(shù)客戶端發(fā)出此類響應(yīng),其也是最原始的響應(yīng)類型;②NTLM響應(yīng)——此類響應(yīng)主要由基于 NT構(gòu)架的客戶端發(fā)出,包括 Windows 2000和 XP;③NTLMv2響應(yīng)——這是一個(gè)新的響應(yīng)類型,Windows NT Service Pack 4對(duì)此有所介紹。在激活的 NTLM version 2系統(tǒng)中,其代替了 NTLM響應(yīng);④LMv2響應(yīng)——在 NTLM version 2系統(tǒng)中,其是 LM響應(yīng)的替代者;⑤NTLM2會(huì)話響應(yīng)—其用于無(wú) NTLMv2鑒別情況下的 NTLM2會(huì)話安全協(xié)商過(guò)程中,此策略對(duì) LM響應(yīng)和NTLM響應(yīng)的語(yǔ)義有所改變。
大多數(shù)客戶端發(fā)出的是 LM響應(yīng)類,這一策略早于 NTLM響應(yīng),安全性不如 NTLM,當(dāng)新一代的客戶端支持 NTLM時(shí),其往往將此兩類響應(yīng)一并發(fā)送,以實(shí)現(xiàn)與不同合法的服務(wù)器間的兼容性,因此,在很多LM響應(yīng)類型客戶端、盡管其支持 NTLM響應(yīng),但安全缺陷依然存在。而NTLM響應(yīng)是由新一代客戶端發(fā)出,這一策略在安全性方面較 LM響應(yīng)有很大的改進(jìn)。
Windows系統(tǒng)提供了一個(gè)用戶身份鑒別框架,就是著名的 SSPI(the Security Support Provider Interface),類似于微軟的 GSS-API(Generic Security Service Application Program Interface),它提供了應(yīng)用于網(wǎng)絡(luò)協(xié)議上層、具有獨(dú)立機(jī)制的身份鑒別方式。SSPI支持幾個(gè)潛在的服務(wù)供應(yīng)商,NTLMSSP(NTLM Security Support Provider)就是其中之一,它提供了NTLM鑒別機(jī)制,上面已有所提及。
SSPI提供了十分靈活的 API,用于處理非透明的、特殊提供者的鑒別令牌,前面提到的 NTLM的各類消息就是這樣的令牌,其細(xì)節(jié)由 NTLMSSP處理。SSPI提供的 API對(duì) NTLM的所有細(xì)節(jié)進(jìn)行了精簡(jiǎn),應(yīng)用開(kāi)發(fā)人員甚至不需要意識(shí)到正在應(yīng)用 NTLM。這里僅簡(jiǎn)要地描述應(yīng)用于 NTLM中的 SSPI鑒別握手過(guò)程 (如圖2所示)。
圖2 NTLM中的 SSPI鑒別握手過(guò)程
(1)客戶端通過(guò) SSPI的 Acquire Credentials Handle函數(shù)獲得為用戶設(shè)置的信用描述信息,然后調(diào)用SSPI的 Initialize Security Context函數(shù)以獲得一個(gè)鑒別請(qǐng)求令牌,如前述中的第一類消息。最后發(fā)送此令牌給服務(wù)器端,Initialize Security Context函數(shù)返回值指明鑒別過(guò)程將要求多步操作才能完成。
(2)服務(wù)器端接收從客戶端發(fā)來(lái)的令牌,以此作為輸入,調(diào)用 SSPI的 Accept Security Context函數(shù),由此在服務(wù)器端創(chuàng)建了本地安全上下文,描述客戶端。然后產(chǎn)生一個(gè)鑒別響應(yīng)令牌,如前述中的第二類消息,發(fā)往客戶端。Accept Security Context函數(shù)的返回值指明有必要進(jìn)一步從客戶端獲取信息,以完成鑒別過(guò)程。
(3)客戶端接收由服務(wù)器端發(fā)來(lái)的響應(yīng)令牌,以此做為輸入,再次調(diào)用 Initialize Security Context函數(shù),產(chǎn)生另一個(gè)鑒別請(qǐng)求令牌,如前述中的第三類消息,其返回值指明安全上下文已被成功地初始化,然后將此鑒別請(qǐng)求令牌發(fā)往服務(wù)器端。
(4)服務(wù)器端接收由客戶端發(fā)來(lái)的令牌,以此作為輸入,再次調(diào)用 Accept Security Context函數(shù),其返回值指明上下文已被成功地接收,不再產(chǎn)生新的令牌,鑒別過(guò)程到此完成了。
T0Net系統(tǒng)主要功能是為不同的局域網(wǎng)之間的通信提供安全、透明的通訊平臺(tái)。目前,局域網(wǎng)應(yīng)用已十分普遍,尤其是局域網(wǎng)內(nèi)的通信、遠(yuǎn)程控制與交互式協(xié)作非常方便。但是,隨著經(jīng)濟(jì)的全球化,企業(yè)的地域界限早已被打破,集中式的辦公方式已為分布式的辦公方式所取代,這就要求在不同的局域網(wǎng)之間能進(jìn)行安全、便捷的通信,然而,幾乎所有的局域網(wǎng)為了安全都裝有防火墻,這給局域網(wǎng)和局域網(wǎng)之間 (通過(guò) INTERNET)通信的便捷性、遠(yuǎn)程控制與交互式協(xié)作造成很大的障礙[2]。T0Net網(wǎng)絡(luò)系統(tǒng)能穿透防火墻、為企業(yè)與企業(yè)之間、企業(yè)與客戶之間建立起安全、便捷、交互式的通訊平臺(tái),實(shí)現(xiàn)了應(yīng)用級(jí)的共享。
T0Net系統(tǒng)能將分布式的局域網(wǎng)通過(guò) INTER-NET連接成一個(gè)大的虛擬局域網(wǎng),實(shí)現(xiàn)安全、透明的訪問(wèn)。與任何系統(tǒng)一樣,用戶在登錄使用該服務(wù)之前,都有一個(gè)身份認(rèn)證與鑒別過(guò)程。通常的方法是先為每個(gè)用戶建立一個(gè)用戶名和密碼,然后,用戶使用該用戶名和密碼登錄,服務(wù)器通過(guò)比較鑒別以確定該用戶是否合法。該方法中,用戶名和密碼無(wú)論是以明文還是加密傳輸,都不能提供足夠的安全性。而作為基于挑戰(zhàn) -響應(yīng)的新型用戶鑒別機(jī)制,NTLM技術(shù)在身份認(rèn)證與鑒別方面,具有更高的安全性。在 T0Net系統(tǒng)就使用了這種機(jī)制。
根據(jù)面向?qū)ο蟪绦蛟O(shè)計(jì)思想[3]:首先創(chuàng)建了一個(gè)基類 class CXNTLMPdu;然后在此基礎(chǔ)上派生三個(gè)消息類:class CXNTLMNegotiationPdu;class CXNTLMChallengePdu class和CXNTLMAuthenticationP-du;最后,因?yàn)?NT LM各類消息是通過(guò) http協(xié)議來(lái)傳輸?shù)?故還創(chuàng)建了一個(gè)類 class CXNTLMOverHttpMgr。具體NTLM類圖創(chuàng)建及繼承關(guān)系如圖3所示。
圖3 NTLM類圖及繼承關(guān)系示意圖
部分代碼框架如下。
基類 class CXNTLMPdu:
class CXNTLMPdu
{
………
public:
BOOL Encode (CXCharStr&strBase64Serialized);
static CXNTLMPdu* Decode(CXCharStr&str-Base64Serialized);
………
public:
static void NTLMS wap(void* pData,int size);
static void SerializeWStrTo(CXByteStream&os,CXWCharStr&wstr);
static void SerializeWStrFrom(LPBYTE lpBuf,WORD wByteLength,
CXWCharStr&wstr);
static void SerializeStrFrom (LPBYTE lpBuf,WORD wByteLength,
CXCharStr&str);
static void Serialize Blob From(LPBYTE lpBuf,WORD wByte Length,
CXBlob&blob);
………
};
三個(gè)派生消息類:
1)協(xié)商 (negotiation)-class CXNTLMNegotiationPdu;
classCXNTLMNegotiationPdu:publicCXNTLMPdu
{
………
public:
virtual int GetPduType(){return XNTLM_NEGOT IAT ION_PDU;}
virtual DWORD Get Serial Length();
virtual DWORD Serialize To(LPBYTE lp Buffer,DWORD dw Length);
virtual DWORD Serialize From(LPBYTE lp Buffer,DWORD dw Length);
………
};
2)挑戰(zhàn) (challenge)-class CXNTLMChallengeP-du;
class CXNTLMChallengePdu:public CXNTLMP-du
{
………
public:
virtual int GetPduType(){return XNTLM_CHALLENGE_PDU;}
virtualDWORD Get SerialLength();
virtual DWORD SerializeTo(LPBYTE lpBuffer,DWORD dw Length);
virtualDWORD SerializeFrom(LPBYTE lpBuffer,DWORD dw Length);
………
BYTE m_abChallenge[8];
BYTE m_abContext[8];
CXPtr Listm_aTarget Info List;
};
3)鑒別 (authentication)-class CXNTLM Authentication Pdu;
class CXNTLM Authentication Pdu:public CXNTLMPdu
{
………
public:
virtual int GetPduType(){return XNTLM_AUTHENTICAT ION_PDU;}
virtualDWORD GetSeria lLength();
virtual DWORD SerializeTo(LPBYTE lpBuffer,DWORD dwLength);
virtualDWORD SerializeFrom(LPBYTE lpBuffer,DWORD dwLength);
public:
//pChalenge points to 8-byte challenge from NTLM type-2 message
//pHash points to a 24-byte buffer
static BOOL GenerateLMHash(LPCSTR lpszPassword,
LPBYTE pChallenge,LPBYTE pHash);
static BOOL GenerateNTLMHash(LPCSTR lpsz-Pass word,
LPBYTE pChallenge,LPBYTE pHash);
static BOOL GenerateHash(LPBYTE ab3Keys,
LPBYTE pChallenge,LPBYTE pHash);
static void SetupDESKey(unsigned char* key_56,
des_key_schedule&ks);
public:
CXBlob&RefLMResponse(){returnm_blobLMResponse;}
CXBlob&RefNTLMResponse(){return m_blobNTLMResponse;}
………
CXBlob m_blobLMResponse;
CXBlob m_blobNTLMResponse;
………
};
最后,NTLM各類消息是通過(guò) http協(xié)議來(lái)傳輸?shù)?故還創(chuàng)建了一個(gè)類 class CXNTLMOverHttpMgr;
class CXNTLMOverHttpMgr
{
public:
CXNTLMOverHttpMgr();
virtual~CXNTLMOverHttpMgr();
………
public:
void Initiate();
BOOL GetNTLM Http Request(CXCharStr&strRequest);
BOOL Process NTLMHttpResponse (LPCSTR lpszResponse);
void Reset();
public:
virtual void Get Authentication Info(
………
CXBlobm_blob Challenge;
CXCharStrm_str Target Name;
};
目前,C/S模式中,大多數(shù)客戶端發(fā)出的是 LM響應(yīng)類,這一策略早于 NTLM響應(yīng),安全性不如 NTLM,當(dāng)新一代的客戶端支持 NTLM時(shí),其往往將此兩類響應(yīng)一并發(fā)送,以實(shí)現(xiàn)與不同的合法服務(wù)器間的兼容性,因此,在很多 LM響應(yīng)類型客戶端、盡管其支持NTLM響應(yīng),但安全缺陷依然存在。而NTLM響應(yīng)是由新一代客戶端發(fā)出,這一策略在安全性方面較LM響應(yīng)有大的改進(jìn)。然而,眾所周知,網(wǎng)絡(luò)安全具有相對(duì)性,NT LM也并非無(wú)懈可擊,當(dāng) NTLM響應(yīng)連帶LM響應(yīng)一并發(fā)出時(shí),此算法上的脆弱性還是可能被黑客所利用,以獲得NTLM響應(yīng)所用的相關(guān)密碼。盡管如此,NT LM身份認(rèn)真與鑒別機(jī)制仍然具有較高的安全性,能滿足絕大多數(shù)用戶的的需求。T0Net系統(tǒng)現(xiàn)已投入使用,取得了較好的實(shí)用效果。
[1] Eric Glass.The NTLM Authentication Protocol[EB/OL].[2009-12-15].http://davenport.sourceforge.net/ntlm.html.
[2] 袁津生.計(jì)算機(jī)網(wǎng)絡(luò)安全基礎(chǔ) [M].北京:人民郵電出版社,2008.
[3] 張海潘.面向?qū)ο蟮某绦蛟O(shè)計(jì) [M].北京:清華大學(xué)出版社,2008.