加密主要有兩種方式:對稱加密和非對稱加密。
對稱加密
對稱加密:采用單鑰密碼系統的加密方法,同一個密鑰可以同時作為信息的加密和解密,這種方式也叫做單密鑰加密。所謂的對稱,就是采用這種加密方式的雙方使用同樣的密鑰進行加密和解密。
密鑰是控制加密和解密過程的指令,算法是一組規則,規定了如何進行加密解密。
加密的安全性不僅取決於加密算法本身,更在於密鑰管理的安全性。
由於對稱加密速度快,所以通常用在消息發送方需要加密大量數據時使用。但是因為加密和解密都使用同一個密鑰,如何把密鑰安全的傳遞到解密者手上就成了必須要解決的問題。
常用的對稱加密有: DES, IDEA, RC2, RC4, SKIPJACK, RC5, AEC算法等。
非對稱加密
非對稱加密算法需要兩個密鑰:公鑰和私鑰
公鑰和私鑰是一對,如果用公鑰加密,只能用對應的私鑰才能解密;如果用私鑰加密,那么只能用對應的公鑰解密。由於加密和解密使用的是兩個不同的密鑰,所以叫這種加密算法叫做非對稱加密算法。
工作原理:
1. A向B發送信息,A和B都要產生一對用於加密和解密的公鑰和私鑰;
2. A的私鑰保密,把公鑰給B;B的私鑰保密,把公鑰給A;
3. A發消息給B,A用B的公鑰加密信息,然后將信息發給B;
4. B收到信息后,用自己的私鑰解密。
也就是說,發送方用接收方的公鑰加密,接收方用自己的私鑰解密,這樣信息就可以安全無誤的到達了。但是依然存在以下問題:
1.A想發數據給B,那么B先生成一對密鑰,然后將自己的公鑰發給A。但是在發公鑰的過程中很可能被第三方C截獲。C截獲B的公鑰之后可能會做幾件事:
(1)使用B的公鑰對數據加密然后發給B,B此時無法分清這個消息是A發的還是C發的
(2)C自己生成一對密鑰,將公鑰發給A,A收到公鑰以為是B發的,用這個公鑰加密之后發消息給B,發給B的過程中被C攔截,C有私鑰,可以知道消息的內容。
那么這些問題該如何解決呢?
只能靠一個第三方機構(CA機構,即證書授權機構)來擔保。
此時的流程就是:
1. A要向B發送數據,B首先將公鑰發給CA機構,CA機構收到B的公鑰之后向B確認這個是否是B發送的公鑰;
2. CA機構確認是B發送的公鑰之后就會為B擔保,生成一份數字證書給B,數字證書包含了CA的擔保認證簽名和B的公鑰,A拿到CA的數字證書后,看到上面有CA的簽名,就可以確定當前拿到的公鑰是B發的,這樣就可以放心的使用公鑰加密數據然后發給B了
Tomcat服務器與加密解密
Tomcat服務器啟動時會啟動多個Connector(連接器),而Tomcat服務器的連接器又可以分為加密連接器和非加密連接器。在server.xml中有配置Connector:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
8080這個端口對應的連接器就是沒有加密的Connector,在請求資源時我們的請求也是不加密的。要是想要以加密的方式來訪問Tomcat服務器,就需要在Tomcat里配置一個加密的Connector。
瀏覽器與服務器交互時,瀏覽器想要將數據加密之后再發送給服務器,該怎么做呢?
首先,服務器要先向瀏覽器出示一份數字證書,瀏覽器看到數字證書之后,就可以使用數字證書里的公鑰加密數據。因此得針對服務器生成一份數字證書。然后再配置一下服務器,讓服務器收到瀏覽器的請求后,向瀏覽器出示它的數字證書。
生成Tomcat服務器的數字證書
sun公司提供了制作證書的工具keytool,在JDK1.4以后版本中都包含了這個工具,它在JAVA_HOME\bin\keytool.exe。使用keytool生成一個名為tomcat的證書,放在.keystore這個密鑰庫中。
keytool -genkey -alias tomcat -keyalg RSA
命令執行完之后,操作系統的用戶文件夾下就會生成.keystore文件,如圖:
可以使用指令查看.keystore密鑰庫里面的所有證書
keytool -list -keystore .keystore
配置HTTP連接器
將生成的.keystore密鑰庫文件拷貝到Tomcat服務器的conf目錄下,如下圖所示:
修改server.xml文件,配置HTTP連接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="123456"/>
配置了一個端口是8443的加密連接器,瀏覽器訪問8443端口的連接器時,將會以加密的方式訪問web服務器,這個連接器收到瀏覽器的請求后,將會向瀏覽器出示一份數字證書,瀏覽器再用數字證書里的公鑰來加密數據。服務器從密鑰庫中提取證書時需要密碼,keystorePass這個屬性就是指明了密碼。
使用"https://localhost:8443/"訪問8443的加密連接器
由於密鑰庫里的證書時我們自己生成的,並沒有經過CA認證,所以在訪問的時候,瀏覽器會出現"證書錯誤,導航已阻止"這種情況,瀏覽器會認為當前要訪問的這個主機是不安全的,不推薦訪問,點擊"繼續瀏覽此網站"即可。
安裝數字證書
為了讓瀏覽器信任我們生成的數字證書,需要將數字證書安裝到瀏覽器中,以IE8為例來安裝證書,過程如下:
證書安裝成功后,重啟IE瀏覽器,使用"https://localhost:8443/"訪問8443的加密連接器,此時瀏覽器就不再提示證書錯誤了。
刪除數字證書
工具----->Internet選項
刪除后重啟瀏覽器即可。