MD5與Base64的思考


MD5加密是對任意長的數據使用MD5哈稀算法散列為4個32位組,若格式化為ASCII字符則為16字符,若格式化16進制表示,則為32字符.  (MD5的具體算法請參閱相關書籍和資料)

MD5廣泛用於數據校驗和完整性檢驗.且不可逆.理論上為抗碰撞

在2004年8月17日,MD5遭遇重創,山東大學的王小雲做了破譯MD5、HAVAL-128、 MD4和RIPEMD算法的報告。(^_^如果大學選擇繼續讀碩,我肯定會去考王小雲的導師,呵)   看來MD5會正式讓位於SHA1了.

回到正題,后來我發現在Asp.Net2.0自帶的Membership中的用戶密碼可以使用MD5加密保存,而據我分析,其並非十六進制格式化字符串,而是采用Base64編碼保存.

Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規范。

Base64要求把每三個8Bit的字節轉換為四個6Bit的字節(3*8 = 4*6 = 24),然后把6Bit再添兩位高位0,組成四個8Bit的字節,也就是說,轉換后的字符串理論上將要比原來的長1/3。


這樣一來,方案就基本定下來,MD5加密后再Base64編碼.后來我又發現一 個問題,若單純這樣做,會有一個問題,那就是如果兩個用戶密碼相同,就會導致在數據庫中保存的數據一樣,  回想當初學認證理論的時候,講過可以用鹽值來解決這個問題,就是給每個用戶生成一個隨機的鹽值,在作保存和校驗時,需要把用戶的Salt值加入到密碼原文 中再作MD5運算,這樣就可以使得相同的密碼生成不同的編碼.

OK,完.

轉換后,我們用一個碼表來得到我們想要的字符串(也就是最終的Base64編碼),這個表是這樣的:(摘自RFC2045)
Table 1: The Base64 Alphabet

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y

原 文的字節數量應該是3的倍數啊,如果這個條件不能滿足的話,那該怎么辦呢?我們的解決辦法是這樣的:原文的字節不夠的地方可以用全0來補足,轉換時 Base64編碼用=號來代替。這就是為什么有些Base64編碼會以一個或兩個等號結束的原因,但等號最多只有兩個。因為:
余數 = 原文字節數 MOD 3
所以余數任何情況下都只可能是0,1,2這三個數中的一個。如果余數是0的話,就表示原文字節數正好是3的倍數(最理想的情況啦)。如果是1的話,為了讓Base64編碼是4的倍數,就要補2個等號;同理,如果是2的話,就要補1個等號。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM