?
一.????
協議
SSL(SecureSocketLayer)
是
netscape
公司提出的主要用于
web
的安全通信標準
,
分為
2.0
版和
3.0
版
.TLS (TransportLayerSecurity)
是
IETF
的
TLS
工作組在
SSL3.0
基礎之上提出的安全通信標準
,
目前版本是
1.0,
即
RFC2246.SSL/TLS
提供的安全機制可以保證應用層數據在互聯網絡傳輸不被監聽
,
偽造和竄改
.
一般情況下的網絡協議應用中,數據在機器中經過簡單的由上到下的幾次包裝,就進入網絡,如果這些包被截獲的話,那么可以很容易的根據網絡協議得到里面的數據
.
由網絡監聽工具可以很容易的做到這一點。
SSL
就是為了加密這些數據而產生的協議,可以這么理解,它是位與應用層和
TCP/IP
之間的一層,數據經過它流出的時候被加密,再往
TCP/IP
送,而數據從
TCP/IP
流入之后先進入它這一層被解密,同時它也能夠驗證網絡連接倆端的身份。
它的主要功能就是倆個:
一:加密解密在網絡中傳輸的數據包
,
同時保護這些數據不被修改
,
和偽造。
二:驗證網絡對話中雙方的身份
SSL
協議包含倆個子協議,一個是包協議,一個是握手協議。包協議是說明
SSL
的數據包應該如何封裝的。握手協議則是說明通信雙方如何協商共同決定使用什么算法以及算法使用的
key
。很明顯包協議位于握手協議更下一層。我們暫時對包協議的內容沒有興趣。
SSL
握手過程說簡單點就是:通信雙方通過不對稱加密算法來協商好一個對稱加密算法以及使用的
key,
然后用這個算法加密以后所有的數據完成應用層協議的數據交換。
握手一般都是由
client
發起的,
SSL
也不例外。
1client
送給
server
它自己本身使用的
ssl
的
version(ssl
一共有三個
version),
加密算法的一些配置,和一些隨機產生的數據,以及其他在
SSL
協議中需要用到的信息。
2server
送給
client
它自己的
SSL
的
version,
加密算法的配置,隨機產生的數據,還會用自己的私有密鑰加密
SERVER-HELLO
信
息。
Server
還同時把自己的證書文件給送過去。同時有個可選的項目,就是
server
可以要求需要客戶的
certificate
。
3client
就用
server
送過來的
certificate
來驗證
server
的身份。如果
server
身份驗證沒通過,本次通信結束。通過證書驗證
之后,得到
server
的公共密鑰,解開
server
送來的被其用私有密鑰加密過的
SERVER-HELLO
信息,看看對頭與否。如果不對,說明對方只有
該
server
的公共密鑰而沒有私有密鑰,必是假的。通信告吹。
4client
使用到目前為止所有產生了的隨機數據
(sharedsecret),client
產生本次握手中的
premastersecret(
這個步
驟是有可能有
server
的參與的,由他們使用的加密算法決定
),
并且把這個用
server
的公共密鑰加密,送回給
server.
如果
server
要求需
要驗證
client,
那么
client
也需要自己把自己的證書送過去,同時送一些自己簽過名的數據過去。
SSL
協議有倆種技術來產生
sharedsecret(
真不好意思,又是一個很難意譯的詞組
),
一種是
RSA,
一種是
EDH.
RSA
就是我們上一章說過的一種不對稱加密算法。首先
server
把自己的
RSA
公共密鑰送給
client,client
于是用這個
key
加密一個隨機產生的值
(
這個隨機產生的值就是
sharedsecret)
,再把結果送給
server.
EDH
也是一種不對稱加密算法,但它與
RSA
不同的是,它好象沒有自己固定的公共密鑰和私有密鑰,都是在程序跑起來的時候產生的,用完就
K
掉。其他的步驟倆者就差不多了。
RSA,DSA,DH
三種不對稱加密算法的區別也就在這里。
RSA
的密鑰固定,后倆個需要一個參數來臨時生成
key.DH
甚至要求雙方使用同樣的參數,這個參數要事先指定。如果
SSL
庫沒有
load
進這個參數,
DH
算法就沒辦法用。
DSA
沒研究過。
5Server
驗證完
client
的身份之后,然后用自己的私有密鑰解密得到
premastersecret
然后雙方利用這個
premastersecret
來共同協商,得到
mastersecret.
6
雙方用
master
一起產生真正的
sessionkey,
著就是他們在剩下的過程中的對稱加密的
key
了。這個
key
還可以用來驗證數據完整性。雙方再交換結束信息。握手結束。
接下來雙方就可以用協商好的算法和
key
來用對稱加密算法繼續下面的過程了。
很簡單吧?其實要復雜一些的,我簡化了很多來說。
不過還是有個問題,喜歡搗蛋的人雖然看不懂他們在交流些什么,但篡改總可以吧?
記得我們在加密算法里面介紹過的哈希算法嗎?就是為了對付這種搗蛋者的。在每次送信息的時候,附帶把整條信息的哈希值也送過去,接收方收到信息的時候,也
把收到的內容哈希一把,然后和對方送來的哈希值對比一下,看看是否正確。搗蛋者如果亂改通信內容,哈希出來的值是不同的,那么就很容易被發現了。
但這樣子,搗蛋者至少可以學舌。他可以把之前監聽到的內容重復發給某一方,而這些內容肯定是正確的
,
無法驗證出有問題的。哎,
SSL
是怎么對付這種人的我還沒看出來。有篇文章說:多放點隨機數在信息里可以對付,我也沒去研究這句話是什么意思。