压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

sha1的hash長度擴展攻擊

sha1的hash原理

說到要解釋sha1的原理其實是非常復雜的,反正筆者這種智商的暫時還無法理解。所以,只能從面上跟大家談一下筆者的理解。

2

首先,當hash函數拿到需要被hash的字符串后,先將其字節長度整除64,取得余數。如果該余數正好等于56,那么就在該字符串最后添加上8個 字節的長度描述符(具體用bit表示)。如果不等于56,就先對字符串進行長度填充,填充時第一個字節為hex(80),其他字節均用hex(00)填 充,填充至余數為56后,同樣增加8個字節的長度描述符(該長度描述符為需要被hash的字符串的長度,不是填充之后整個字符串的長度)。以上過程,稱之 為補位。

補位完成后,字符串以64位一組進行分組(因為上面的余數為56,加上8個字節的長度描述符后,正好是64位,湊成一組)。字符串能被分成幾組就會 進行多少次“復雜的數學變化”。每次進行“復雜的數學變化”都會生成一組新的registers值供下一次“復雜的數學變化”來調用。第一次“復雜的數學 變化”會調用程序中的默認值。當后面已經沒有分組可以進行數學變化時,該組生成的registers值就是最后的hash值。

在sha1的運算過程中,為確保同一個字符串的sha1值唯一,所以需要保證第一次registers的值也唯一。所以在sha1算法中,registers具有初始值。如上圖中的registers值0。

Hash值的隨機性完全依賴于進行“復雜的數學變化”時輸入的registers值和該次運算中字符串分組的數據。如果進行“復雜數學變化”時輸入的registers值和該次運算的字符串分組相同,那么他們各自生成的新的registers值也相同。

03 舉個栗子

當需要被hash的字符串為str_a = ”123456”,程序首先判斷,len(str_a) % 64 == 56是否成立。這里很明顯不成立。那么程序就進行補位操作。首先補位成余數為56的長度。

3

如上圖,藍色字體就為程序對該字符串進行補位的數據。當滿足len(str_a) % 64 == 56后,程序就在該字符串的后面添加8個字節的長度描述符。注意,此處的長度為原始需要被hash的長度。也就是len(str_a) = 6字節*8bit/字節= 48bit=0x30bit。

4

補位+長度描述符=64個字節,正好是一個分組。所以此處只要進行一次復雜的數學變化就可以了。程序根據該64個字節的數據和registers值0生成新的registers值1。那么該新的registers值1就是str_a的sha1值

04 如何利用?

講了這么多,好像都沒講到如何利用該擴展攻擊。那么下面,重點來了。

筆者們還是利用這篇文章上面的例子進行講解,轉到FreeBuf之前文章

簡單來說,就是服務器上會生成一個salt值,該 salt值你是不可預測的。但是你又知道了sha1(salt+filename)的值,該filename的值你也是知道的。假設此處的 filename的值report.pdf,最后sha1的值為:0a8d538b724c6f2b4288526eb540ee7c。為了方便理解,筆者 們繼續假設salt的長度為16位。

5

將上圖的字符串進行sha1操作時,同樣先進行整除,然后取余。最后再補上8位的長度描述符。補位+添加長度描述符后的字符串如下圖:

6

該長度也就滿足了64位的分組,只需要進行一次“復雜的數學運算”就可以得到最后的sha1值了。

下面請各位看官思考如何進行下面一個字符串的sha1操作。

7

同樣,還是先進行分組。由于該字符串的長度大于64個字節,且小于128個字節,所以要分成兩組,需要進行兩次“復雜的數學運算”。這個時候筆者們發 現,第一個分組的數據和上圖中補碼后的數據完全一樣,又因為他們都是第一個分組,初始的registers值也一樣。那么經過第一輪“復雜的數學運算”, 他們各自生成的registers值也同樣是相同的。唯一不同的是,由于上面的長度小于64字節,所以只需要進行一輪運算便得到了最后的sha1值。然后 這里的字符串有兩個分組,需要將第一輪更新的registers值(也就是第一輪運算出來的sha1值)作為第二輪“復雜的數學運算”的 registers值,然后才能得出最終的sha1值。

根據上面例子就說明,如果salt的值你不知道, 但是你知道長度,又知道sha1(salt),那么就也就可以知道sha1(salt+“填充數據”+“任意可控數據”).這里的salt+“填充數據” 就是對salt進行sha1時所補全的數據+最后8位的長度描述符。一般來說,salt+”填充數據”的長度就是64字節,正好是一個分組。如果salt 的長度就大于了56個字節,那么加入填充數據后的長度應該是N個64字節,等于N個分組。

為什么?你可以想象,sha1程序再對(salt+“填充數據”+“任意可控數據”)進行hash時,只需要進行第二輪及第二輪以后的運算。因為第一輪運算后的registers值就是sha1(salt)的值,該值你已經知道了。

什么??還是不懂??你把上面的例子中的“123456789abcdefgreport.pdf”想成是salt,然后再考慮下呢?

上一篇:淺析大規模生產網絡的縱深防御架構

下一篇:linux常見漏洞利用技術實踐