一、MD5
MD5全稱為信息-摘要算法(哈希算法),是計算機安全領域的散列函數,用於確保消息的完整性。另外摘要算法還有SHA1,具體請度娘。
MD5是一種單向加密,它的加密不可逆,它將任意長度的字符串,經過算法計算后生成固定長度的數據,一般為16位表示。
1、MD5的用途:
(1)消息完整性:每份數據生成的MD5碼不同,所以可以把MD5碼和數據一塊發送,在對端使用MD5加密對數據加密在與接收的MD5碼做對比,保證數據的正確性。
(2)安全訪問認證:常被用到 mysql 和傳遞用戶賬戶信息和密碼,從用戶端發送到服務器的只是一段128位的摘要,服務器拿到后直接將其存入數據庫,下次登錄只需與服務器的密文進行對比即可,這樣保護了用戶的信息,即便是后台人員也無法去獲取用戶的賬戶密碼。
2、數字簽名:MD5生成代碼
public static String encryption(String plainText) { String re_md5 = new String(); try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); 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)); } re_md5 = buf.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return re_md5; }
看知乎:https://www.zhihu.com/question/22311285
上面說MD5其實不算是一種加密算法,用處大多在文件的是否完整,和密碼的保護上,更多詳情查看大神解析。
3、項目應用:
在文件傳輸項目中,就通常使用MD5用於保證用戶的消息完整性,和用戶賬戶密碼的保護。
在客戶端,使用MD5將用戶的賬戶和密碼,進行MD5加密,傳遞給服務器,服務器將其與服務器所保存的MD5進行對比,如果比配就將用戶自己的界面返回給用戶,然后進行數據的傳輸,也是使用MD5,在對端對數據進行加密,匹配查看數據是否完整。
二、其他加密算法
非對稱加密:包括RSA DSA RCC,非對稱加密是相比對稱加密而言的。
對稱加密:包括AES,DES,3DES
兩者的關系:對稱加密是在加密前雙方都應該知道加密算法和密鑰,而且密鑰相同。比如:A和B實現約定使用的加密算法和解密密鑰,然后進行數據傳輸。
非對稱加密是雙方各自產生自己的密鑰,然后將自己的加密密鑰傳遞給對方,在使用時先給數據使用對方的加密密鑰加密,發送給對方后,各自使用自己的解密密鑰來解密數據。
不過對稱加密解密速度慢,安全性能高;非對稱加密速度快,安全性能不高,所以經常使用非對稱加密傳遞對稱加密的密鑰,然后使用對稱加密來加密傳遞的數據。
三、AES:
1、簡介
高級加密標准(AES - Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。
對稱加密算法也就是加密和解密用相同的密鑰,具體的加密流程如下圖:
下面簡單介紹下各個部分的作用與意義:
(1)明文P:沒有經過加密的數據。
(2)密鑰K:用來加密明文的密碼,在對稱加密算法中,加密與解密的密鑰是相同的。
密鑰為接收方與發送方協商產生,但不可以直接在網絡上傳輸,否則會導致密鑰泄漏,通常是通過非對稱加密算法加密密鑰,然后再通過網絡傳輸給對方,或者直接面對面商量密鑰。密鑰是絕對不可以泄漏的,否則會被攻擊者還原密文,竊取機密數據。
(3)AES加密函數:
設AES加密函數為E,則 C = E(K, P),其中P為明文,K為密鑰,C為密文。也就是說,把明文P和密鑰K作為加密函數的參數輸入,則加密函數E會輸出密文C。
(4)密文C:經加密函數處理后的數據
(5)AES解密函數:
設AES解密函數為D,則 P = D(K, C),其中C為密文,K為密鑰,P為明文。也就是說,把密文C和密鑰K作為解密函數的參數輸入,則解密函數會輸出明文P。
2、對稱加密算法與非對稱加密算法的區別
(1)對稱加密算法
加密和解密用到的密鑰是相同的,這種加密方式加密速度非常快,適合經常發送數據的場合。
缺點是密鑰的傳輸比較麻煩。
(2)非對稱加密算法
加密和解密用的密鑰是不同的,這種加密方式是用數學上的難解問題構造的,通常加密解密的速度比較慢,適合偶爾發送數據的場合。
優點是密鑰傳輸方便。
常見的非對稱加密算法為RSA、ECC和EIGamal。
(3)實際中,一般是通過RSA加密AES的密鑰,傳輸到接收方,接收方解密得到AES密鑰,然后發送方和接收方用AES密鑰來通信。
3、AES的基本結構
在AES標准規范中,分組長度只能是128位,也就是說,每個分組為16個字節(每個字節8位)。密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數也不同,如下表所示:
AES | 密鑰長度(32位比特字) | 分組長度(32位比特字) | 加密輪數 |
---|---|---|---|
AES-128 | 4 | 4 | 10 |
AES-192 | 6 | 4 | 12 |
AES-256 | 8 | 4 | 14 |
AES加密是一種分組加密,他將明文划分一組一組的,每組明文長度相等,一次加密一組明文,直到全部加密,分組長度為128位(16字節),明文長度不足的進行填充。
AES加密是字節加密,使用時要轉成字節碼。明文分組用字節單位的正方形矩陣表示,一般稱為狀態矩陣。
128位會進行10輪加密,一輪加密步驟:字節代換,行位移,列混合,輪密鑰加。在最后一輪不進行列混合;解密反過來,分為輪密鑰加,逆列混合,逆行位移,逆字節代換,第一步不進行逆列混合。
AES加密的內容詳見這篇博客:https://blog.csdn.net/qq_28205153/article/details/55798628
關於AES加密的一些內容,也可以見之前的博客:從nodejs的AES加密解密之后文件大小不一致的問題談談AES加密中的補位、nodejs大文件分片加密解密