Java中String生成MD5

//先上Java代碼
public String getMD5(String s) {
        char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};        
        try {
            byte[] btInput = s.getBytes("utf-8");
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            mdInst.update(btInput);
            byte[] md = mdInst.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

MD5簡(jiǎn)介

MD5全名: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)百度百科鏈接

特點(diǎn)

MD5算法具有如下特點(diǎn):

  • 壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的。
  • 容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。
  • 抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別。
  • 強(qiáng)抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。

應(yīng)用

MD5算法主要應(yīng)用于:

  1. 一致性驗(yàn)證
  2. 數(shù)字簽名
  3. 安全訪問(wèn)認(rèn)證

原理

  1. MD5以512位分組來(lái)處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過(guò)了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。
  2. 運(yùn)算流程:


    流程圖

2.1 填充數(shù)據(jù):在MD5算法中,首先要對(duì)信息進(jìn)行填充,使其位長(zhǎng)隊(duì)512位求余的結(jié)果是448,并且填充必須進(jìn)行,即使其位長(zhǎng)對(duì)512的求余等于448.因此,信息的位長(zhǎng)將會(huì)擴(kuò)展為N*512+448,N為非負(fù)整數(shù),N可以是0。
填充的方法如下:

2.1.1 在信息后面填充一個(gè)1和無(wú)數(shù)個(gè)0,直到滿足上面的條件式才停止用0對(duì)信息填充。

2.1.2 在這個(gè)結(jié)果后面附加一個(gè)以64位二進(jìn)制表示的填充前信息長(zhǎng)度,如果二進(jìn)制表示的填充前信息長(zhǎng)度超過(guò)64位,則取最低的64位。
經(jīng)過(guò)這兩步的處理,信息的位長(zhǎng)=(N+1)*512;即長(zhǎng)度剛好為512位的倍數(shù)。 這樣做的原因是滿足后面處理中對(duì)信息長(zhǎng)度的要求。

2.2 初始化變量
初始化的128位的值為初試連接變量,這些參數(shù)用于第一輪的運(yùn)算,以大端字節(jié)序來(lái)表示,他們分別是:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。

2.3 處理分組數(shù)據(jù)

每一分組的算法流程如下:
第一分組需要將上面四個(gè)鏈接變量復(fù)制到另外四個(gè)變量中:A到a,B到b,C到c,D到d。從第二分組開(kāi)始的變量為上一分組的運(yùn)算結(jié)果,即A = a, B = b, C = c, D = d。
主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進(jìn)行16次操作。每次操作對(duì)a、b、c和d中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第四個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向左環(huán)移一個(gè)不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。
以下是每次操作中用到的四個(gè)非線性函數(shù)(每輪一個(gè))。
F( X ,Y ,Z ) = ( X & Y ) | ( (~X) & Z )
G( X ,Y ,Z ) = ( X & Z ) | ( Y & (~Z) )
H( X ,Y ,Z ) =X ^ Y ^ Z
I( X ,Y ,Z ) =Y ^ ( X | (~Z) )
(&是與(And),|是或(Or),~是非(Not),^是異或(Xor))
這四個(gè)函數(shù)的說(shuō)明:如果X、Y和Z的對(duì)應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。
F是一個(gè)逐位運(yùn)算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。
假設(shè)Mj表示消息的第j個(gè)子分組(從0到15),常數(shù)ti是4294967296*abs( sin(i) )的整數(shù)部分,i 取值從1到64,單位是弧度。(4294967296=232

現(xiàn)定義:
FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作為 a = b + ( (a + F(b,c,d) + Mj + ti) << s)
GG(a ,b ,c ,d ,Mj ,s ,ti ) 操作為 a = b + ( (a + G(b,c,d) + Mj + ti) << s)
HH(a ,b ,c ,d ,Mj ,s ,ti) 操作為 a = b + ( (a + H(b,c,d) + Mj + ti) << s)
II(a ,b ,c ,d ,Mj ,s ,ti) 操作為 a = b + ( (a + I(b,c,d) + Mj + ti) << s)
注意:“<<”表示循環(huán)左移位,不是左移位。
這四輪(共64步)是:
第一輪
FF(a ,b ,c ,d ,M0 ,7 ,0xd76aa478 )
FF(d ,a ,b ,c ,M1 ,12 ,0xe8c7b756 )
FF(c ,d ,a ,b ,M2 ,17 ,0x242070db )
FF(b ,c ,d ,a ,M3 ,22 ,0xc1bdceee )
FF(a ,b ,c ,d ,M4 ,7 ,0xf57c0faf )
FF(d ,a ,b ,c ,M5 ,12 ,0x4787c62a )
FF(c ,d ,a ,b ,M6 ,17 ,0xa8304613 )
FF(b ,c ,d ,a ,M7 ,22 ,0xfd469501)
FF(a ,b ,c ,d ,M8 ,7 ,0x698098d8 )
FF(d ,a ,b ,c ,M9 ,12 ,0x8b44f7af )
FF(c ,d ,a ,b ,M10 ,17 ,0xffff5bb1 )
FF(b ,c ,d ,a ,M11 ,22 ,0x895cd7be )
FF(a ,b ,c ,d ,M12 ,7 ,0x6b901122 )
FF(d ,a ,b ,c ,M13 ,12 ,0xfd987193 )
FF(c ,d ,a ,b ,M14 ,17 ,0xa679438e )
FF(b ,c ,d ,a ,M15 ,22 ,0x49b40821 )
第二輪
GG(a ,b ,c ,d ,M1 ,5 ,0xf61e2562 )
GG(d ,a ,b ,c ,M6 ,9 ,0xc040b340 )
GG(c ,d ,a ,b ,M11 ,14 ,0x265e5a51 )
GG(b ,c ,d ,a ,M0 ,20 ,0xe9b6c7aa )
GG(a ,b ,c ,d ,M5 ,5 ,0xd62f105d )
GG(d ,a ,b ,c ,M10 ,9 ,0x02441453 )
GG(c ,d ,a ,b ,M15 ,14 ,0xd8a1e681 )
GG(b ,c ,d ,a ,M4 ,20 ,0xe7d3fbc8 )
GG(a ,b ,c ,d ,M9 ,5 ,0x21e1cde6 )
GG(d ,a ,b ,c ,M14 ,9 ,0xc33707d6 )
GG(c ,d ,a ,b ,M3 ,14 ,0xf4d50d87 )
GG(b ,c ,d ,a ,M8 ,20 ,0x455a14ed )
GG(a ,b ,c ,d ,M13 ,5 ,0xa9e3e905 )
GG(d ,a ,b ,c ,M2 ,9 ,0xfcefa3f8 )
GG(c ,d ,a ,b ,M7 ,14 ,0x676f02d9 )

GG(b ,c ,d ,a ,M12 ,20 ,0x8d2a4c8a )
第三輪
HH(a ,b ,c ,d ,M5 ,4 ,0xfffa3942 )
HH(d ,a ,b ,c ,M8 ,11 ,0x8771f681 )
HH(c ,d ,a ,b ,M11 ,16 ,0x6d9d6122 )
HH(b ,c ,d ,a ,M14 ,23 ,0xfde5380c )
HH(a ,b ,c ,d ,M1 ,4 ,0xa4beea44 )
HH(d ,a ,b ,c ,M4 ,11 ,0x4bdecfa9 )
HH(c ,d ,a ,b ,M7 ,16 ,0xf6bb4b60 )
HH(b ,c ,d ,a ,M10 ,23 ,0xbebfbc70 )
HH(a ,b ,c ,d ,M13 ,4 ,0x289b7ec6 )
HH(d ,a ,b ,c ,M0 ,11 ,0xeaa127fa )
HH(c ,d ,a ,b ,M3 ,16 ,0xd4ef3085 )
HH(b ,c ,d ,a ,M6 ,23 ,0x04881d05 )
HH(a ,b ,c ,d ,M9 ,4 ,0xd9d4d039 )
HH(d ,a ,b ,c ,M12 ,11 ,0xe6db99e5 )
HH(c ,d ,a ,b ,M15 ,16 ,0x1fa27cf8 )
HH(b ,c ,d ,a ,M2 ,23 ,0xc4ac5665 )
第四輪
II(a ,b ,c ,d ,M0 ,6 ,0xf4292244 )
II(d ,a ,b ,c ,M7 ,10 ,0x432aff97 )
II(c ,d ,a ,b ,M14 ,15 ,0xab9423a7 )
II(b ,c ,d ,a ,M5 ,21 ,0xfc93a039 )
II(a ,b ,c ,d ,M12 ,6 ,0x655b59c3 )
II(d ,a ,b ,c ,M3 ,10 ,0x8f0ccc92 )
II(c ,d ,a ,b ,M10 ,15 ,0xffeff47d )
II(b ,c ,d ,a ,M1 ,21 ,0x85845dd1 )
II(a ,b ,c ,d ,M8 ,6 ,0x6fa87e4f )
II(d ,a ,b ,c ,M15 ,10 ,0xfe2ce6e0 )
II(c ,d ,a ,b ,M6 ,15 ,0xa3014314 )
II(b ,c ,d ,a ,M13 ,21 ,0x4e0811a1 )
II(a ,b ,c ,d ,M4 ,6 ,0xf7537e82 )
II(d ,a ,b ,c ,M11 ,10 ,0xbd3af235 )
II(c ,d ,a ,b ,M2 ,15 ,0x2ad7d2bb )
II(b ,c ,d ,a ,M9 ,21 ,0xeb86d391 )
所有這些完成之后,將a、b、c、d分別在原來(lái)基礎(chǔ)上再加上A、B、C、D。
即a = a + A,b = b + B,c = c + C,d = d + D
然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行以上算法。

2.4 輸出

最后的輸出是a、b、c和d的級(jí)聯(lián)。
當(dāng)你按照我上面所說(shuō)的方法實(shí)現(xiàn)MD5算法以后,你可以用以下幾個(gè)信息對(duì)你做出來(lái)的程序作一個(gè)簡(jiǎn)單的測(cè)試,看看程序有沒(méi)有錯(cuò)誤。
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") =
f29939a25efabaef3b87e2cbfe641315
MD5 ("8a683566bcc7801226b3d8b0cf35fd97") =cf2cb5c89c5e5eeebef4a76becddfcfd
MD5加密字符串實(shí)例
現(xiàn)以字符串“jklmn”為例。
該字符串在內(nèi)存中表示為:6A 6B 6C 6D 6E(從左到右為低地址到高地址,后同),信息長(zhǎng)度為40 bits, 即0x28。
對(duì)其填充,填充至448位,即56字節(jié)。結(jié)果為:
6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
剩下64位,即8字節(jié)填充填充前信息位長(zhǎng),按小端字節(jié)序填充剩下的8字節(jié),結(jié)果為。
6A 6B 6C 6D 6E 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 00 00 00 00
(64字節(jié),512 bits)
初始化A、B、C、D四個(gè)變量。
將這64字節(jié)填充后數(shù)據(jù)分成16個(gè)小組(程序中對(duì)應(yīng)為16個(gè)數(shù)組),即:
M0:6A 6B 6C 6D (這是內(nèi)存中的順序,按照小端字節(jié)序原則,對(duì)應(yīng)數(shù)組M(0)的值為0x6D6C6B6A,下同)
M1:6E 80 00 00
M2:00 00 00 00
.....
M14:28 00 00 00
M15:00 00 00 00
經(jīng)過(guò)“3. 分組數(shù)據(jù)處理”后,a、b、c、d值分別為0xD8523F60、0x837E0144、0x517726CA、0x1BB6E5FE
在內(nèi)存中為a:60 3F 52 D8
b:44 01 7E 83
c:CA 26 77 51
d:FE E5 B6 1B
a、b、c、d按內(nèi)存順序輸出即為最終結(jié)果:603F52D844017E83CA267751FEE5B61B。這就是字符串“jklmn”的MD5值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 MD5(單向散列算法)的全稱是Message-Digest Algorithm 5(信息-摘要算法),經(jīng)MD...
    梅_梅閱讀 1,098評(píng)論 1 4
  • varhash = hex_md5("123dafd"); alert(hash) /* * A JavaScri...
    一只大橘閱讀 2,039評(píng)論 0 2
  • MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室和RSA...
    沒(méi)能唱給你的歌曲閱讀 1,056評(píng)論 2 6
  • 版本記錄 前言 在這個(gè)信息爆炸的年代,特別是一些敏感的行業(yè),比如金融業(yè)和銀行卡相關(guān)等等,這都對(duì)app的安全機(jī)制有更...
    刀客傳奇閱讀 3,283評(píng)論 0 11
  • var rotateLeft = function(lValue, iShiftBits) { return(lV...
    nick2046閱讀 1,016評(píng)論 0 0

友情鏈接更多精彩內(nèi)容