<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
MD全稱Message-Digest,即資訊摘要,所以MD家族的演演算法也叫資訊摘要演演算法
MD家族有MD2、MD3、MD4、MD5,一代比一代強。
所以MD5是MD演演算法家族中,目前最常用的一種加密演演算法。
任何資訊,都可以通過MD5演演算法運算生成一個16位元組(128位元)的雜湊值,但卻無法通過這16個位元組的雜湊值獲得加密前的資訊。
最終這16個雜湊值,通常用一個長度為32的十六進位制字串來表示。
這就是MD5最重要的一個特性:加密不可逆。
加密不可逆,即無法通過密文得到原文。
不變性,即相同的原文,通過MD5演演算法得到的密文總是相同的。
雜湊性,即對原文作輕微的改動,都可導致最終的密文完全改變。
如果張三給李四傳了一個檔案,如何確認這個檔案傳給李四是完整的呢
張三傳檔案前,先對檔案做一個MD5加密,同時把MD5加密的密文傳給李四
李四收到檔案,也對該檔案做MD5加密,如果得到的密文和張三給的密文一樣,就說明檔案是完整的。
使用者密碼,理論上也不能直接明文儲存在資料庫中,因為一旦資料庫被破解,使用者的密碼就全部丟失了
所以可以將使用者密碼做一個MD5加密,然後將密文存在資料庫中
使用者登入的時候,可以將使用者的密碼進行MD5加密,然後比對密文和資料庫中的密文是否一致,來判斷使用者前臺填的密碼是否正確。
這只是一個思路,一般不會這麼簡單,一般生產環境會對使用者密碼加鹽加密等等的處理,使用者資訊更加重要的,則需要更加複雜的計算邏輯。
MD5的加密過程,整體來看,就是先定義四個值,然後用這四個值,對原文資訊進行計算,並得到新的四個值,然後再對原文進行計算,再得到新的四個值,如此迴圈一定次數,最終對最後的這四個值進行簡單的字串拼接,就得到了最終的密文。
主要就是下面這3步:
用原文長度位數對512求餘,如果結果不為448,就填充到448位元。填充是第一位填1,後面填0。512-448=64,用這剩餘的64位元,記錄原文長度。
最終得到一個填補完的資訊(總長=原文長度+512位元)
四個初始值,是MD5這個演演算法提前定義好的,分別是4個32位元的值,總共剛好128位元。
我們用ABCD命名:
計算分為多次迴圈,每次迴圈,都是用ABCD和原文在第一步填補完的資訊,進行計算,最終得到新的ABCD。最後將最後一次ABCD拼成字串,就是最終的密文。
我們看看單次子迴圈都做了什麼:
下面是單次子迴圈真正的計算邏輯(這段實現摘自網友):
圖中,A,B,C,D就是雜湊值的四個分組。每一次迴圈都會讓舊的ABCD產生新的ABCD。一共進行多少次迴圈呢?由處理後的原文長度決定。
上面這張圖所表達的就是單次子迴圈的流程。
下面對圖中其他元素一一解釋:
1.綠色F
圖中的綠色F,代表非線性函數。官方MD5所用到的函數有四種:
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))
在主迴圈下面64次子迴圈中,F、G、H、I 交替使用,第一個16次使用F,第二個16次使用G,第三個16次使用H,第四個16次使用I。
2.紅色“田”字
很簡單,紅色的田字代表相加的意思。
3.Mi
Mi是第一步處理後的原文。在第一步中,處理後原文的長度是512的整數倍。把原文的每512位元再分成16等份,命名為M0 ~ M15,每一等份長度32。在64次子迴圈中,每16次迴圈,都會交替用到M1 ~ M16之一。
4.Ki
一個常數,在64次子迴圈中,每一次用到的常數都是不同的。
5.黃色的<<
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
<<<s表示迴圈左移s位
第一輪 a=FF(a,b,c,d,M0,7,0xd76aa478) b=FF(d,a,b,c,M1,12,0xe8c7b756) c=FF(c,d,a,b,M2,17,0x242070db) d=FF(b,c,d,a,M3,22,0xc1bdceee) a=FF(a,b,c,d,M4,7,0xf57c0faf) b=FF(d,a,b,c,M5,12,0x4787c62a) c=FF(c,d,a,b,M6,17,0xa8304613) d=FF(b,c,d,a,M7,22,0xfd469501) a=FF(a,b,c,d,M8,7,0x698098d8) b=FF(d,a,b,c,M9,12,0x8b44f7af) c=FF(c,d,a,b,M10,17,0xffff5bb1) d=FF(b,c,d,a,M11,22,0x895cd7be) a=FF(a,b,c,d,M12,7,0x6b901122) b=FF(d,a,b,c,M13,12,0xfd987193) c=FF(c,d,a,b,M14,17,0xa679438e) d=FF(b,c,d,a,M15,22,0x49b40821) 第二輪 a=GG(a,b,c,d,M1,5,0xf61e2562) b=GG(d,a,b,c,M6,9,0xc040b340) c=GG(c,d,a,b,M11,14,0x265e5a51) d=GG(b,c,d,a,M0,20,0xe9b6c7aa) a=GG(a,b,c,d,M5,5,0xd62f105d) b=GG(d,a,b,c,M10,9,0x02441453) c=GG(c,d,a,b,M15,14,0xd8a1e681) d=GG(b,c,d,a,M4,20,0xe7d3fbc8) a=GG(a,b,c,d,M9,5,0x21e1cde6) b=GG(d,a,b,c,M14,9,0xc33707d6) c=GG(c,d,a,b,M3,14,0xf4d50d87) d=GG(b,c,d,a,M8,20,0x455a14ed) a=GG(a,b,c,d,M13,5,0xa9e3e905) b=GG(d,a,b,c,M2,9,0xfcefa3f8) c=GG(c,d,a,b,M7,14,0x676f02d9) d=GG(b,c,d,a,M12,20,0x8d2a4c8a) 第三輪 a=HH(a,b,c,d,M5,4,0xfffa3942) b=HH(d,a,b,c,M8,11,0x8771f681) c=HH(c,d,a,b,M11,16,0x6d9d6122) d=HH(b,c,d,a,M14,23,0xfde5380c) a=HH(a,b,c,d,M1,4,0xa4beea44) b=HH(d,a,b,c,M4,11,0x4bdecfa9) c=HH(c,d,a,b,M7,16,0xf6bb4b60) d=HH(b,c,d,a,M10,23,0xbebfbc70) a=HH(a,b,c,d,M13,4,0x289b7ec6) b=HH(d,a,b,c,M0,11,0xeaa127fa) c=HH(c,d,a,b,M3,16,0xd4ef3085) d=HH(b,c,d,a,M6,23,0x04881d05) a=HH(a,b,c,d,M9,4,0xd9d4d039) b=HH(d,a,b,c,M12,11,0xe6db99e5) c=HH(c,d,a,b,M15,16,0x1fa27cf8) d=HH(b,c,d,a,M2,23,0xc4ac5665) 第四輪 a=II(a,b,c,d,M0,6,0xf4292244) b=II(d,a,b,c,M7,10,0x432aff97) c=II(c,d,a,b,M14,15,0xab9423a7) d=II(b,c,d,a,M5,21,0xfc93a039) a=II(a,b,c,d,M12,6,0x655b59c3) b=II(d,a,b,c,M3,10,0x8f0ccc92) c=II(c,d,a,b,M10,15,0xffeff47d) d=II(b,c,d,a,M1,21,0x85845dd1) a=II(a,b,c,d,M8,6,0x6fa87e4f) b=II(d,a,b,c,M15,10,0xfe2ce6e0) c=II(c,d,a,b,M6,15,0xa3014314) d=II(b,c,d,a,M13,21,0x4e0811a1) a=II(a,b,c,d,M4,6,0xf7537e82) b=II(d,a,b,c,M11,10,0xbd3af235) c=II(c,d,a,b,M2,15,0x2ad7d2bb) d=II(b,c,d,a,M9,21,0xeb86d391)
MD5不可逆的原因,從原理上來看,
比如有10110011,我們左移三位,變成了10011000,高三位的101被頂了,低三位用0代替了,那此時就絕對不可能用10011000再逆向得到10110011了。
public class MD5Util { public static void main(String[] args) throws IOException { System.out.println(encodeString("123")); } public static String encodeString(String plainText) throws UnsupportedEncodingException { return encodeBytes(plainText.getBytes("UTF-8")); } public static String encodeBytes(byte[] bytes) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(bytes); byte b[] = md.digest(); int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) { i += 256; } if (i < 16) { buf.append("0"); } buf.append(Integer.toHexString(i)); } return buf.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45