ssl加密的方法
關鍵詞: ssl加密的方法
隨着計算機網絡技術的發展,方便快捷的互連網令人們漸漸習慣了從Web頁上收發E-mail、購物和
交易,這時Web頁面上須要傳輸重要或敏感的數據,例如用戶的銀行賬戶、密碼等,因此網絡安全
就成爲現代計算機網絡應用急需解決的問題。
現行網上銀行和電子商務等大型的網上交易系統廣泛採用HTTP和SSL相結合的方式。服務器端採用
支持SSL的Web服務器,用戶端採用支持SSL的瀏覽器實現安全通訊。
SSL是Secure Socket Layer(安全套接層協議)的縮寫,能夠在Internet上提供祕密性傳輸。
Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協議標準,目前已有3.0版本。SSL採用公
開密鑰技術。其目標是保證兩個應用間通訊的保密性和可靠性,可在服務器端和用戶端同時實現支
持。目前,利用公開密鑰技術的SSL協議,已成爲Internet上保密通信的工業標準。本文着重在
SSL協議和SSL程序設計兩方面談談做者對SSL的理解。
SSL協議初步介紹
安全套接層協議能使用戶/服務器應用之間的通訊不被攻擊者竊聽,而且始終對服務器進行認證,
還可選擇對用戶進行認證。SSL協議要求創建在可靠的傳輸層協議(TCP)之上。SSL協議的優點在於
它是與應用層協議獨立無關的,高層的應用層協議(例如:HTTP,FTP,TELNET等)能透明地創建於
SSL協議之上。SSL協議在應用層協議通訊以前就已經完成加密算法、通訊密鑰的協商及服務器認證
工做。在此以後應用層協議所傳送的數據都會被加密,從而保證通訊的私密性。
經過以上敘述,SSL協議提供的安全信道有如下三個特性:
1.數據的保密性
信息加密就是把明碼的輸入文件用加密算法轉換成加密的文件以實現數據的保密。加密的過程須要
用到密匙來加密數據而後再解密。沒有了密鑰,就沒法解開加密的數據。數據加密以後,只有密匙
要用一個安全的方法傳送。加密過的數據能夠公開地傳送。
2.數據的一致性
加密也能保證數據的一致性。例如:消息驗證碼(MAC),可以校驗用戶提供的加密信息,接收者可
以用MAC來校驗加密數據,保證數據在傳輸過程當中沒有被篡改過。
3.安全驗證
加密的另一個用途是用來做爲我的的標識,用戶的密匙能夠做爲他的安全驗證的標識。
SSL是利用公開密鑰的加密技術(RSA)來做爲用戶端與服務器端在傳送機密資料時的加密通信協定。
目前,大部分的Web 服務器及瀏覽器都普遍支持SSL 技術。當瀏覽器試圖鏈接一個具備SSL認證加
密的服務器時,就會喚醒一個SSL會話,瀏覽器檢查認證,必須具有下面三個條件:
1)有一個權威機構發放證書,固然能夠建立自我簽定的證書(x509 結構)。
2)證書不能過時。
3)證書是屬於它所鏈接的服務器的。
只有所有具有了這三個條件,瀏覽器才能成功完成認證。經過這三個條件,用戶能確認其瀏覽器鏈接
到正確的服務器,而不是鏈接到一些想盜取用戶密碼等重要信息的虛假的服務器上。
在當今的電子商務中還有一項被普遍使用的安全協議是SET協議。SET(Secure Electronic Transaction,
安全電子交易)協議是由VISA和MasterCard兩大信用卡公司於1997年5月聯合推出的規範。SET能在電
子交易環節上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺詐的可能性。SET交
易分三個階段進行:用戶向商家購物並肯定支付;商家與銀行覈實;銀行向商家支付貨款。每一個階段都
涉及到RSA對數據加密,以及RSA數字簽名。使用SET協議,在一次交易中,要完成屢次加密與解密操做,
故有很高的安全性,但SET協議比SSL協議複雜,商家和銀行都須要改造系統以實現互操做。
在Linux 下,比較流行支持SSL認證的是OpenSSL服務器。OpenSSL項目是一個合做的項目,開發一個
健壯的、商業等級的、完整的開放源代碼的工具包,用強大的加密算法來實現安全的Socket層
(Secure Sockets Layer,SSL v2/v3)和傳輸層的安全性(Transport Layer Security,TLS v1)。
這個項目是由全世界的志願者管理和開發OpenSSL工具包和相關文檔。
如何在Linux下配置OpenSSL服務器,首先從OpenSSL的主頁(http://www.openssl.org/)上下載
openssl-version.tar.gz軟件包來編譯安裝,與Apache服務器配合能夠創建支持SSL的Web服務器,
並可使用自我簽定的證書作認證,關於如何編譯、安裝OpenSSL服務器,能夠參考一下OpenSSL HOWTO
文檔。
SSL 程序設計初步介紹
SSL 通信模型爲標準的C/S 結構,除了在 TCP 層之上進行傳輸以外,與通常的通信沒有什麼明顯的區
別。在這裏,咱們主要介紹如何使用OpenSSL進行安全通信的程序設計。關於OpenSSL 的一些詳細的信
息請參考OpenSSL的官方主頁 http://www.openssl.org。
在使用OpenSSL前,必須先對OpenSSL 進行初始化,如下的三個函數任選其一:
SSL_library_init(void);
OpenSSL_add_ssl_algorithms();
SSLeay_add_ssl_algorithms();
事實上 後面的兩個函數只是第一個函數的宏。
若是要使用OpenSSL的出錯信息,使用SSL_load_error_strings (void)進行錯誤信息的初始化。之後
可使用void ERR_print_errors_fp(FILE *fp) 打印SSL的錯誤信息。
一次SSL鏈接會話通常要先申請一個SSL 環境,基本的過程是:
1. SSL_METHOD* meth = TLSv1_client_method(); 建立本次會話鏈接所使用的協議,若是是客戶端可
以使用
SSL_METHOD* TLSv1_client_method(void); TLSv1.0 協議
SSL_METHOD* SSLv2_client_method(void); SSLv2 協議
SSL_METHOD* SSLv3_client_method(void); SSLv3 協議
SSL_METHOD* SSLv23_client_method(void); SSLv2/v3 協議
服務器一樣須要建立本次會話所使用的協議:
SSL_METHOD *TLSv1_server_method(void);
SSL_METHOD *SSLv2_server_method(void);
SSL_METHOD *SSLv3_server_method(void);
SSL_METHOD *SSLv23_server_method(void);
須要注意的是客戶端和服務器須要使用相同的協議。
2.申請SSL會話的環境 CTX,使用不一樣的協議進行會話,其環境也是不一樣的。申請SSL會話環
境的OpenSSL函數是
SSLK_CTX* SSL_CTX_new (SSL_METHOD*); 參數就是前面咱們申請的 SSL通信方式。返回當前
的SSL 鏈接環境的指針。
而後根據本身的須要設置CTX的屬性,典型的是設置SSL 握手階段證書的驗證方式和加載本身
的證書。
void SSL_CTX_set_verify (SSL_CTX* , int , int* (int, X509_STORE_CTX*) )
設置證書驗證的方式。
第一個參數是當前的CTX 指針,第二個是驗證方式,若是是要驗證對方的話,就使用
SSL_VERIFY_PEER。不須要的話,使用SSL_VERIFY_NONE.通常狀況下,客戶端須要驗證對方,而
服務器不須要。第三個參數是處理驗證的回調函數,若是沒有特殊的須要,使用空指針就能夠了。
void SSL_CTX_load_verify_locations(SSL_CTX*, const char* , const char*);
加載證書;
第一個參數同上,參數二是證書文件的名稱,參數三是證書文件的路徑;
int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
加載本地的證書;type 指明證書文件的結構類型;失敗返回-1
int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
加載本身的私鑰;type 參數指明私鑰文件的結構類型;失敗返回-1
加載了證書和文件以後,就能夠驗證私鑰和證書是否相符:
BOOl SSL_CTX_check_private_key (SSL_CTX*);
3.既然SSL 使用TCP 協議,固然須要把SSL attach 到已經鏈接的套接字上了:
SSL* SSL_new (SSL_CTX*); 申請一個SSL 套節字;
int SSL_set_rfd (SSL*); 綁定只讀套接字
int SSL_set_wfd (SSL*); 綁定只寫套接字
int SSL_set_fd ( SSL*); 綁定讀寫套接字
綁定成功返回 1, 失敗返回0;
4. 接下來就是SSL 握手的動做了
int SSL_connect (SSL*); 失敗返回 -1
5. 握手成功以後,就能夠進行通信了,使用SSL_read 和SS_write 讀寫SSL 套接字代替傳統的
read 、write
int SSL_read (SSL *ssl, char *buf, int num );
int SSL_write (SSL *ssl, char *buf, int num);
若是是服務器,則使用 SSL_accept 代替傳統的 accept 調用
int SSL_accept(SSL *ssl);
6. 通信結束,須要釋放前面申請的 SSL資源
int SSL_shutdown(SSL *ssl); 關閉SSL套接字;
void SSL_free (ssl); 釋放SSL套接字;
void SSL_CTX_free (ctx); 釋放SSL環境;
OpenSSL 雖然已經發展到了0.9.96版本,可是它的文檔還不多,甚至連最基本的man 函數手
冊都沒有完成。因此,本文牢牢是講述了使用OpenSSL 進行程序設計的框架。更加詳細的資
料能夠參考OpenSSL 的文檔或者 Apache mod_ssl 的文檔。
經過以上的介紹,我想讀者對SSL協議已經有了必定的瞭解,做者有機會將會繼續給你們介紹
SSL協議的其餘方面的內容。
SSL原理解密
本文出自:
http://noc.cstnet.net.cn/範曉明RSA公鑰加密在計算機產業中被普遍使用在認證和加密。能夠從RSA Data Security Inc.得到的RSA公鑰加密許可證。公鑰加密是使用一對非對稱的密碼加密或解密的方法。每一對密碼由公鑰和私鑰組成。公鑰被普遍發佈。私鑰是隱密的,不公開。用公鑰加密的數據只可以被私鑰解密。反過來,使用私鑰加密的數據只能用公鑰解密。這個非對稱的特性使得公鑰加密頗有用。使用公鑰加密法認證認證是一個身份認證的過程。在下列例子中包括甲和乙,公鑰加密會很是輕鬆地校驗身份。符號{數據} key意味着"數據"已經使用密碼加密或解密。假如甲想校驗乙的身份。乙有一對密碼,一個是公開的,另外一個是私有的。乙透露給甲他的公鑰。甲產生一個隨機信息發送給乙。甲——〉乙:random-message乙使用他的私鑰加密消息,返回甲加密後的消息。 乙——〉甲:{random-message}乙的私鑰甲收到這個消息而後使用乙的之前公開過的公鑰解密。他比較解密後的消息與他原先發給乙的消息。若是它們徹底一致,就會知道在與乙說話。任意一箇中間人不會知道乙的私鑰,也不能正確加密甲檢查的隨機消息。除非你清楚知道你加密的消息。用私鑰加密消息,而後發送給其餘人不是一個好主意。由於加密值可能被用來對付你,須要注意的是:由於只有你纔有私鑰,因此只有你才能加密消息。因此,代替加密甲發來的原始消息,乙建立了一個信息段而且加密。信息段取自隨機消息(random-message)並具備如下有用的特性:1. 這個信息段難以還原。任何人即便假裝成乙,也不能從信息段中獲得原始消息;2. 假冒者將發現不一樣的消息計算出相同的信息段值;3. 使用信息段,乙可以保護本身。他計算甲發出的隨機信息段,而且加密結果,併發送加密信息段返回甲。甲可以計算出相同的信息段而且解密乙的消息認證乙。這個技術僅僅描繪了數字簽名。經過加密甲產生的隨機消息,乙已經在甲產生的消息簽名。所以咱們的認證協議還須要一次加密。一些消息由乙產生:甲——〉乙:你好,你是乙麼?乙——〉甲:甲,我是乙{信息段[甲,我是乙] } 乙的私鑰當你使用這個協議,乙知道他發送給乙的消息,他不介意在上面簽名。他先發送不加密的信息,"甲,我是乙。",而後發送信息段加密的消息版本。甲能夠很是方便地校驗乙就是乙,同時,乙尚未在他不想要的信息上簽名。提交公鑰那麼,乙怎樣以可信的方式提交他的公鑰呢?看看認證協議以下所示:甲——〉乙:你好乙——〉甲:嗨,我是乙,乙的公鑰甲——〉乙:prove it乙——〉甲:甲,我是乙 {信息段[甲,我是乙] } 乙的私鑰在這個協議下,任何人都可以成爲"乙"。全部你所要的只是公鑰和私鑰。你發送給甲說你就是乙,這樣你的公鑰就代替了乙的密碼。而後,你發送用你的私鑰加密的消息,證實你的身份。甲卻不能發覺你並非乙。爲了解決這個問題,標準組織已經發明瞭證書。一個證書有如下的內容:* 證書的發行者姓名* 發行證書的組織* 標題的公鑰* 郵戳證書使用發行者的私鑰加密。每個人都知道證書發行者的公鑰(這樣,每一個證書的發行者擁有一個證書)。證書是一個把公鑰與姓名綁定的協議。經過使用證書技術,每個人均可以檢查乙的證書,判斷是否被假冒。假設乙控制好他的私鑰,而且他確實是獲得證書的乙,就萬事大吉了。這些是修訂後的協議:甲——〉乙:你好乙——〉甲:嗨,我是乙,乙的校驗甲——〉乙:prove it乙——〉甲:甲,我是乙 {信息段[甲, 我是乙] } 乙的私鑰如今當甲收到乙的第一個消息,他能檢查證書,簽名(如上所述,使用信息段和公鑰解密),而後檢查標題(乙的姓名),肯定是乙。他就能相信公鑰就是乙的公鑰和要求乙證實本身的身份。乙經過上面的過程,製做一個信息段,用一個簽名版本答覆甲。甲能夠校驗乙的信息段經過使用從證書上獲得的公鑰並檢查結果。若是一個黑客,叫H甲——〉H:你好H——〉不能創建一個令甲相信的從乙的消息。交換密碼(secret)一旦甲已經驗證乙後,他能夠發送給乙一個只有乙能夠解密、閱讀的消息:甲——〉乙:{secret}乙的公鑰惟一找到密碼的方法只有使用乙的私鑰解碼上述的信息。交換密碼是另外一個有效使用密碼加密的方法。即便在甲和乙之間的通信被偵聽,只有乙才能獲得密碼。使用密碼做爲另外一個secret-key加強了網絡的安全性,可是此次這是一個對稱的加密算法(例如DES、RC四、IDE甲)。由於甲在發送給乙以前產生了密碼,因此甲知道密碼。乙知道密碼由於乙有私鑰,可以解密甲的信息。但他們都知道密碼,他們都可以初始化一個對稱密碼算法,並且開始發送加密後的信息。這兒是修定後的協議:甲——〉乙:你好乙——〉甲:嗨,我是乙,乙的校驗甲——〉乙:prove it乙——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰甲——〉乙:ok 乙,here is a secret {secret}乙的公鑰乙——〉甲:{some message}secret-key黑客竊聽那麼若是有一個惡意的黑客H在甲和乙中間,雖然不能發現甲和乙已經交換的密碼,但能干擾他們的交談。他能夠放過大部分信息,選擇破壞必定的信息(這是很是簡單的,由於他知道甲和乙通話採用的協議)。甲——〉H:你好H——〉乙:你好乙——〉H:嗨,我是乙,乙的校驗H——〉甲:嗨,我是乙,乙的校驗甲——〉H:prove itH——〉乙:prove it乙——〉H:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰H——〉甲:甲,我是乙 {信息段[甲,我是乙] }乙的私鑰甲——〉H:ok 乙,here is a secret {secret} 乙的公鑰H——〉乙:ok 乙,here is a secret {secret} 乙的公鑰乙——〉H:{some message}secret-keyH——〉甲:Garble[{some message}secret-key ]H忽略一些數據不修改,直到甲和乙交換密碼。而後H干擾乙給甲的信息。在這一點上,甲相信乙,因此他可能相信已經被幹擾的消息而且盡力解密。須要注意的是,H不知道密碼,他所能作的就是毀壞使用祕鑰加密後的數據。基於協議,H可能不能產生一個有效的消息。但下一次呢?爲了阻止這種破壞,甲和乙在他們的協議中產生一個校驗碼消息(message authentication code)。一個校驗碼消息(MAC)是一部分由密碼和一些傳輸消息產生的數據。信息段算法描述的上述特性正是它們抵禦H的功能:MAC= Digest[some message,secret ]由於H不知道密碼,他不能得出正確的值。即便H隨機干擾消息,只要數據量大,他成功的機會微乎其微。例如,使用HD5(一個RSA發明的好的加密算法),甲和乙可以發送128位MAC值和他們的消息。H猜想正確的MAC的概率將近1/18,446,744,073,709,551,616約等於零。這是又一次修改後的協議:甲——〉乙:你好乙——〉甲:嗨,我是乙,乙的校驗甲——〉乙:prove it乙——〉甲:嗨,我是乙,乙的校驗甲,我是乙{信息段[甲,我是乙] } 乙的私鑰ok 乙,here is a secret {secret} 乙的公鑰{some message,MAC}secret-key如今H已經無技可施了。他干擾了獲得的全部消息,但MAC計算機可以發現他。甲和乙可以發現僞造的MAC值而且中止交談。H再也不能與乙通信。OpenSSL FAQ