加密
一.對稱加密
特點:
加密和解密使用同一個秘鑰
存在的問題
加密解密用同一個密鑰,被黑客攔截知道密鑰后安全喪失
二.非對稱加密
特點:
加密和解密使用不同的秘鑰,一把作為公開的公鑰,另一把作為私鑰。公鑰加密的信息,只有私鑰才能解密。私鑰加密的信息,只有公鑰才能解密
公鑰可以公開給別人進行加密,私鑰永遠在自己手里,非常安全,黑客攔截也沒用,因為私鑰未公開
存在的問題:
相比於對稱加密,速度會比較慢一些
2.1 簡單原理
公鑰加密的數據無法使用公鑰反推出來,例如
A告訴B,公鑰是3233,17
假設B要傳的數據是44
那么根據公式計算
B就把678這個數字傳給A
上面說了,反着推是推不出來的
那A怎么解密呢?A自己還有一個密匙2753,用自己的密匙算一下就知道了
那為什么公鑰加密的信息可以通過私鑰解密?為什么公鑰加密很難反推出來?這個我就不知道了,我對這方面也沒什么興趣,感興趣的可以找一些大學公開課看看
2.2實際應用
此時還有一個問題,那就是
假如A與B進行通信,A持有私鑰,B持有公鑰
存在一個黑客C,可以截獲到AB之間發送的任何信息
那么C就可以知道B所持有的公鑰,從而知道A發送給B的任何信息
也就是B->A的信息他無法破解
但A->B的信息他都能知道
這樣一來加密似乎沒什么意義
那么在實際的生產生活中解決方法是,使用非對稱傳遞對稱加密密鑰,然后使用對稱加密傳遞消息
即
(1) A需要在銀行的網站做一筆交易,他的瀏覽器首先生成了一個對稱密鑰
(2) A的瀏覽器向銀行的服務器請求非對稱加密公鑰
(3) 銀行系統自動生成一對非對稱密鑰,然后將其中的公鑰發送給A
(4) A的瀏覽器使用銀行發來的公鑰將自己之前生成的對稱密鑰加密
(5) A的瀏覽器將加密后的對稱密鑰發送給銀行
(6) 銀行使用私鑰解密得到A發來的對稱密鑰
(7) 之后,A與銀行使用對稱密鑰進行通信
三.hash散列
根據key值和hash函數計算得到一個計算結果,我們希望能夠達到的結果是
嚴格來說不算是加密
Hash算法特別的地方在於它是一種單向算法,用戶可以通過Hash算法對目標信息生成特定長度且唯一的Hash值,但不能通過這個Hash值重新獲得目標信息。因此Hash算法常用在不可還原的密碼存儲、信息完整性校驗等
MD5
簡介
MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進制數字串)。
特點
1、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
2、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。(不可逆)
3、壓縮性:任意長度的數據,算出的MD5值長度都是固定的128bit
4、容易計算:從原數據計算出MD5值很容易。
bcrypt
依賴
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
代碼
public class BcryptTest {
public static void main(String[] args) {
//用戶密碼
String password = "123456";
//密碼加密
BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
//加密
String newPassword = passwordEncoder.encode(password);
System.out.println("加密密碼為:"+newPassword);
//對比這兩個密碼是否是同一個密碼
boolean matches = passwordEncoder.matches(password, newPassword);
System.out.println("兩個密碼一致:"+matches);
}
}