天天看點

atitit.安全的簽名摘要 算法attilax總結

atitit.安全的簽名 算法attilax總結

1. MD5 (不推薦)結果是128位二進制,隻有轉為16進制字元串是32位 1

2. 使用sha1算法加密後的密串長度有40位,相對更安全一些。Sha2安全更高 1

3. CRC32 (一般8位資料) 2

4. SHA-1 會碰撞嗎 3

5.   LM-HASH (32個字元) 3

6. NT-HASH值為 (32個字元) 4

1. MD5 (不推薦)結果是128位二進制,隻有轉為16進制字元串是32位 

并且這是一個不可逆的變換過程,要破解隻能窮舉,難度很大,理論上8位的密碼組合有(26字母+10數字+21常用英文符号)的8次方種可能,以現在比較 好的機器機器要算上一年多。MD5加密後的密串長度有16位和32位兩種。不過最近MD5聽說被破解了(聽說還是被我們的國人破掉的,佩服啊!),能很快 碰撞到密碼,不過破解機還沒有流傳出來。

MD5将任意長度的“位元組串”映射為一個128bit的大整數,并且是通過該128bit反推...這種加密技術被廣泛的應用于Unix系統中,這也是為什麼Unix系統比一般作業系統更為

,MD5結果是128位二進制,隻有轉為16進制字元串是32位

2. 使用sha1算法加密後的密串長度有40位,相對更安全一些。Sha2安全更高

3、SHA1

SHA全稱為Secure Hash Algorithm,又叫安全雜湊演算法。SHA是由美國國家安全局(NSA)所設計,并由美國國家标準與技術研究院(NIST)釋出,SHA家族算法有 SHA-1、SHA-224、SHA-256、SHA-384和SHA-512(後四者通常并稱SHA2),原理和MD4、MD5相似。SHA可将一個最 大2^64位(2305843009213693952位元組)資訊,轉換成一串160位(20位元組)的散列值(摘要資訊),是目前應用最廣的HASH算 法。同MD5一樣,從理論角度,SHA1也不是絕對可靠,目前也已經找到SHA1的碰撞條件,但“實用”的碰撞算法軟體還沒出現。于是美國NIST又開始 使用SHA2,研究更新的加密算法。

在Microsoft Visual Studio 2005對sha1的使用也很簡單,下面是在C#中使用sha1加密字元串的例子:

public string sha1(string str)

{        

    return System.Web.Security.FormsAuthentication.

           HashPasswordForStoringInConfigFile(str, "sha1").ToLower();        

}

不過最後還有一個不幸的消息,就是sha1算法已經被破解,國家标準和科技學院(National Institute of Standards and Technology)已經推薦使用sha-256或者sha-512算法

3. CRC32 (一般8位資料)

CRC全稱為Cyclic Redundancy Check,又叫循環備援校驗。CRC是目前使用中最老的一種校驗算法,它是由W. Wesley Peterson在1961年發表的論文中提出,CRC是種根據網絡資料封包或電腦檔案等資料産生簡短固定位數校驗碼的一種散列函數(HASH,把任意長 度的輸入通過雜湊演算法,最終變換成固定長度的摘要輸出,其結果就是散列值,按照HASH算法,HASH具有單向性,不可逆性),主要用來檢測或校驗資料傳 輸或者儲存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來并且附加到資料後面,然後接收方進行檢驗确定資料是否發生變化。一般來說,循環備援校 驗的值都是32位的整數。由于本函數易于用二進制的電腦硬體使用、容易進行數學分析并且尤其善于檢測傳輸通道幹擾引起的錯誤,是以獲得廣泛應用。

盡管CRC在錯誤檢測中非常有用,但CRC并不能可靠地校驗資料完整性,這是因為CRC多項式是線性結構,可以非常容易地通過改變資料方式達到 CRC碰撞,這裡給一個更加通俗的解釋,假設一串帶有CRC校驗的代碼在傳輸中,如果連續出現差錯,當出錯次數達到一定次數時,那麼幾乎可以肯定會出現一 次碰撞(值不對但CRC結果正确),但随着CRC資料位增加,碰撞幾率會顯著降低,比如CRC32比CRC16具有更可靠的驗證性,CRC64又會比 CRC32更可靠,當然這都是按照ITU規範标準條件下。

正因為CRC具有以上特點,對于網絡上傳輸的檔案類很少隻使用CRC作為校驗依據,檔案傳輸相比通信底層傳輸風險更大,很容易受到人為幹預影響。

補充:雖然目前這幾種校驗算法都找到了破解條件,但像目前主流使用的MD5、SHA1還是值得信賴的,因為MD5和SHA1都具有高度的離散性,哪怕是隻 修改一個位元組值都會導緻MD5或SHA1值“巨大”變化,從實踐角度,不同資訊具有相同MD5或SHA1碼的可能性非常低,通常認為是不可能的,對于普通 的下載下傳檔案或作業系統,想通過簡單的修改某個位元組或某些位元組,又要保證檔案名、大小和安裝可靠性的前提下,想達到MD5、SHA1碰撞效果也幾乎是不可能 的。

 現在需要擔心什麼

  MD5 會發生碰撞已經是被發現的了,但是我們需要擔心嗎,我要說的是,目前為止還不用擔心,首先要構造 MD5 碰撞是非常難的,理論上字元串越長 MD5 就越不可能相同,并且借助 SHA-1 算法的幫助,雙管齊下,也就沒有太大問題了,是以現在 MD5 還沒有輪到被棄用的時候。

4.   SHA-1 會碰撞嗎

  SHA-1 也會發生碰撞,但是幾率比 MD5 小的多。

 怎樣解決碰撞

  解決碰撞其實可以通過 MD5 和 SHA-1 結合使用來實作。我是這樣做的,首先将檔案 A 的 MD5 值記為 B 再把 A 的 SHA-1 記為 C,之後用将 B 和 C 相加之後再次運算 MD5 值就好了,MD5 值碰撞的幾率已經很小,再結合 SHA-1 的話,基本上就不會發生碰撞的問題出現了。在新的算法普及之前,MD5 還是可以繼續使用的。

5.   LM-HASH (32個字元)

LanManager(LM)

(1)Windows下LM Hash值生成原理

    假設明文密碼是“Welcome”,首先全部轉換成大寫“WELCOME”,再做将密碼字元串大寫轉後後的字元串變換成二進制串: “WELCOME” -> 57454C434F4D4500000000000000

       技巧:可以将明文密碼複制到UltraEdit編輯器中使用二進制方式檢視即可擷取密碼的二進制串。

       說明:如果明文密碼經過大寫變換後的二進制字元串不足14位元組,則需要在其後添加0x00補足14位元組。然後切割成兩組7位元組的資料,分别經str_to_key()函數處理得到兩組8位元組資料:

    57454C434F4D45 -str_to_key()-> 56A25288347A348A

    00000000000000 -str_to_key()-> 0000000000000000

    這兩組8位元組資料将做為DESKEY對魔術字元串“KGS!@#$%”進行标準DES加密

    "KGS!@#$%" -> 4B47532140232425

    56A25288347A348A -對4B47532140232425進行标準DES加密-> C23413A8A1E7665F

    0000000000000000 -對4B47532140232425進行标準DES加密-> AAD3B435B51404EE

      将加密後的這兩組資料簡單拼接,就得到了最後的LM Hash

    LM Hash: C23413A8A1E7665FAAD3B435B51404EE

6. NT-HASH值為 (32個字元)

。早期SMB協定在網絡上傳輸明文密碼。後來出現"LAN Manager Challenge/Response"驗證機制,簡稱LM,它是如此簡單以至很容易被破解。微軟提出了WindowsNT挑戰/響應驗證機制,稱之為NTLM

Windows下NTLM Hash生成原理

       從IBM設計的LM Hash算法存在幾個弱點,微軟在保持向後相容性的同時提出了自己的挑戰響應機制,NTLM Hash應運而生。假設明文密碼是“123456”,首先轉換成Unicode字元串,與LM Hash算法不同,這次不需要添加0x00補足14位元組

      "123456" -> 310032003300340035003600

        從ASCII串轉換成Unicode串時,使用little-endian序,微軟在設計整個SMB協定時就沒考慮過big-endian序,ntoh*()、hton*()函數不宜用在SMB封包解碼中。0x80之前的标準ASCII碼轉換成Unicode碼,就是簡單地從0x??變成0x00??。此類标準ASCII串按little-endian序轉換成Unicode串,就是簡單地在原有每個位元組之後添加0x00。對所擷取的Unicode串進行标準MD4單向哈希,無論資料源有多少位元組,MD4固定産生128-bit的哈希值,

        16位元組310032003300340035003600 -進行标準MD4單向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4

        就得到了最後的NTLM Hash

        NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4

        與LM Hash算法相比,明文密碼大小寫敏感,無法根據NTLM Hash判斷原始明文密碼是否小于8位元組,擺脫了魔術字元串"KGS!@#$%"。MD4是真正的單向哈希函數,窮舉作為資料源出現的明文,難度較大。

LM隻能存儲小于等于14個字元的密碼hash,如果密碼大于14個,windows就自動使用NTLM對其進行加密了,(這個在LC5裡有兩種破解方式,是以破解不出來的時候可以換種思路,基本是NTLM的)一般情況下使用PwDump或其他一些hash導出工具(如Cain)導出的hash都有對應的LM和NTLM值,也就是說這個密碼位數<=14,如果大于14位那麼就隻有對應的NTLM hash可用了,這時LM也會有值,但對我們來說沒用,不能靠他來查LM彩虹表。 

      作業系統:對于XP、win2k和win2k3來說,系統預設使用LM進行加密(也可人為設定成NTLM),之後的win2008、win7和Vista禁用了LM,預設使用NTLM,是以不要拿着LM生成的rainbow table去找NTLM的hash值,但是反過來卻可以,因為使用LM方式的加密往往會存在一個對應的NTLM hash(如果密碼位數<=14的話,系統同時對這個密碼使用NTLM加密并存儲了NTLM的hash),這時候使用ophcrack的NTLM表查找的就是這個NTLM的hash了,而不是LM的hash。