最近忙,事比較多,活多了,還要降薪,唉。沒什麼時間看書,將以前的一些技術blog也移到這裡。NTLM在去年年底和今年年初研究過一陣子,寫了總結和例子程式。裡面涉及很多演算法,在網上查了很久。(下面是以前的部落格)最近想實現一個通過PROXY穿越的網路編程,將相關的內容進行一下匯總。很多東西來自網路共產主義,也應該為共產主義有所回饋。介紹NT-hash的實現。 從IBM設計的LM Hash演算法存在幾個弱點,微軟在保持向後相容性的同時提出了自己的挑戰響應機制,NTLM
Hash應運而生。假設明文口令是“123456”,首先轉換成Unicode字串,與LM
Hash演算法不同,這次不需要添加0x00補足14位元組,並且是區分大小寫。 "123456" -> 310032003300340035003600。 SMB報文解碼中。0x80之前的標準ASCII碼轉換成Unicode碼,就是簡單地從0x??變成0x00??。此
類標準ASCII串按little-
endian序轉換成Unicode串,就是簡單地在原有每個位元組之後添加0x00。對所擷取的Unicode串進行標準MD4單向雜湊,無論資料來源有多
少位元組,MD4固定產生128-bit的雜湊值。
16位元組310032003300340035003600 -進行標準MD4單向雜湊->
32ED87BDB5FDC5E9CBA88547376818D4
就得到了最後的NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4。
static void unicode(IN char * src, IN int src_len, OUT char * dst,
OUT int * dst_len){
int i
;
for( i = 0 ;
i < src_len; i ++){
dst[2*i] =
src[i];
dst[2*i +1]
= 0;
}
if(dst_len
!= NULL)
* dst_len =
src_len * 2;
}
void nt_hash(IN char * src, IN int is_unicode,OUT unsigned char *
dst, OUT int * dst_len){
char *
source = NULL;
int len =
strlen(src);
if(!is_unicode){
source =
(char * ) malloc(len *2 );
unicode(src,len,source,&len);
}else{
source =
src;
}
MD4String
(source,len,dst);
if(dst_len
!= NULL)
* dst_len =
16;
if(!is_unicode)
free(source);
}
調用例子:
unsigned char dst[16];
nt_hash("123456",0,dst,NULL)
相關連結:我的網路通訊相關文章
NTLM的實現:
- 實現PROXY穿越(16):NTLM的PROXY穿越
- 實現PROXY穿越(15):NTLM Session Security
- 實現PROXY穿越(14):NTLM type3 Message
- 實現PROXY穿越(13):NTLM type2 Message
- 實現PROXY穿越(12):NTLM type1 Message
- 實現PROXY穿越(11):NTLMv2 session response
- 實現PROXY穿越(10):NTLMv2 response
- 實現PROXY穿越(9):NTLMv1 response
- 實現PROXY穿越(8):NT-Hash的實現
- 實現PROXY穿越(7):MD4和MD5
- 實現PROXY穿越(6):LM-Hash的實現
- 實現PROXY穿越(5):DES演算法之三
- 實現PROXY穿越(4):DES演算法之二
- 實現PROXY穿越(3):DES演算法之一
- 實現PROXY穿越(2):Base64演算法
- 實現PROXY穿越(1):流程和NTLM演算法