發(fā)布源:深圳維創(chuàng)信息技術發(fā)布時間:2020-11-09 瀏覽次數(shù): 次
加密傳輸加密主要有兩種方式:對稱加密和非對稱加密。
對稱加密對稱加密算法在加密和解密時使用的是同一個秘鑰。
對稱加密的模式是:- 甲方選擇某一種加密規(guī)則,對信息進行加密- 乙方使用同一種規(guī)則,對信息進行解密客戶端和服務端進行通信,采用對稱加密,如果只使用一個秘鑰,很容易破解;如果每次用不同的秘鑰,海量秘鑰的管理和傳輸成本又會比較高。
非對稱加密非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開密鑰(pubpc key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。
非對稱加密的模式則是:- 乙方生成兩把密鑰(公鑰和私鑰)。
公鑰是公開的,任何人都可以獲得,私鑰則是保密的- 甲方獲取乙方的公鑰,然后用它對信息加密- 乙方得到加密后的信息,用私鑰解密。
即使黑客拿到了公鑰,沒有私鑰也是沒有辦法解密,不考慮彩虹表的情況,完全可以長期使用一對秘鑰。
RSA算法最經典的非對稱加密算法是RSA算法。
RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
公鑰私鑰成對出現(xiàn),用其中一個加密只能用另一個解密,通常用公鑰加密私鑰解密。
為什么RSA能夠做到非對稱加密呢?互質關系:如果兩個正整數(shù),除了1以外,沒有其他公因子,我們就稱這兩個數(shù)是互質關系簡單來說,RSA利用的原理是,如果兩個互質關系的正整數(shù)的乘積足夠大,是極難進行因式分解的(目前被破解的最長RSA密鑰是768個二進制位,而正常使用的至少是1024位的密鑰)。
通過一定的運算,把某計算結果和乘積作為公鑰,另一個計算結果和乘積作為私鑰,即可以實現(xiàn),利用公鑰進行加密,并利用私鑰進行解密。
具體的數(shù)學公式推導和證明可以參考RSA算法原理。
github的登錄方式傳輸層面的加密解密原理講的差不多了,我們來看看github是如何傳輸賬號密碼的。
抓包看一下登錄請求的request,赫然發(fā)現(xiàn),密碼是通過明文傳輸?shù)?hellip;…那么,這種傳輸方式安全嘛?還可以,因為使用了https,但還不夠安全。
http和https常規(guī)的http請求,所有信息明文傳播,只要中間人在鏈路中的任意階段進行劫持,就會帶來三大風險:竊聽風險(eavesdropping):第三方可以獲知通信內容。
篡改風險(tampering):第三方可以修改通信內容。
冒充風險(pretending):第三方可以冒充他人身份參與通信。
怎么解決這些問題?用https。
https 可以認為是 http + TLS,TLS 是傳輸層加密協(xié)議,它的前身是 SSL 協(xié)議。
SSL/TLS協(xié)議是為了解決http的三大風險而設計的,希望達到:- 內容加密。
所有信息都是加密傳播,第三方無法竊聽。- 身份認證。
配備身份證書,防止身份被冒充。
即使被 DNS 劫持到了第三方站點,也會提醒用戶有可能被劫持- 數(shù)據(jù)完整性。
防止內容被第三方冒充或者篡改。
具有校驗機制,一旦被篡改,通信雙方會立刻發(fā)現(xiàn)。
說了這么多,https到底做了什么?結合以下流程圖,講解一次https請求都發(fā)生了什么:
1、客戶端發(fā)起https請求
2、服務端的配置一般需要向權威機構申請一個證書(也可以自己制作,這個會在之后的中間人攻擊中講到,區(qū)別就是自己頒發(fā)的證書需要客戶端驗證通過,才可以繼續(xù)訪問,而使用受信任的公司申請的證書則不會提示),證書會生成RSA加密使用的一對公鑰A和私鑰B。
3、傳送證書這個證書主要內容是公鑰A,也包含了其他信息,如證書的頒發(fā)機構,過期時間等等。
4、客戶端解析證書由客戶端的TLS來完成的,主要是驗證公鑰A是否有效,比如頒發(fā)機構,過期時間等等,如果發(fā)現(xiàn)異常,則會彈出一個警告框,提示證書存在問題。
如果證書沒有問題,那么就生成一個隨機值。
之后就進入了不對稱加密(RSA)的過程,用證書對該隨機值進行加密,生成私鑰C。
5、傳送加密信息這部分傳送的是用證書加密后的隨機值(即私鑰C),目的就是讓服務端得到這個私鑰,后續(xù)所有的數(shù)據(jù)都可以用私鑰C,進行對稱加密和解密。
6、服務端解密信息服務端用私鑰B解密后,得到了客戶端傳過來的私鑰C,到此RSA非對稱加密的過程結束了。
7、傳輸加密后的信息服務端用私鑰C加密信息。
8、客戶端解密信息客戶端用之前生成的私鑰C解密服務端傳過來的信息,于是獲取了解密后的內容。
中間人攻擊(MITM)上面的過程,看起來似乎無懈可擊?并不是,因為“人”才是安全系統(tǒng)中最脆弱的環(huán)節(jié)。
https信息的安全,完全建立在證書可信的基礎上,如果中間人偽造證書怎么辦?黑客自己偽造的證書需要客戶端驗證通過,才可以繼續(xù)訪問,只要客戶端驗證通過,那么公鑰A,私鑰B和私鑰C對黑客來說都是透明的,也有沒有數(shù)據(jù)安全可言了,所以黑客只要誘導用戶安裝自己偽造的證書即可,例如使用各種釣魚的不可描述網站。
所以即使使用https傳輸明文密碼,也不是絕對安全的。
那怎么樣才能保證密碼安全呢?百度的登錄方式抓包看一下百度的登錄請求發(fā)現(xiàn),密碼是加密過的:怎么加密的?我們發(fā)現(xiàn),有這么一個關鍵請求:response里有pubkey,意味著,密碼使用RSA進行加密和解密處理的,這個請求傳輸?shù)氖枪€。
那么流程是什么樣的呢?查了一下github中,關鍵詞RSA,star數(shù)最多的JavaScript庫jsencrypt,驚喜的發(fā)現(xiàn),百度登錄的加密方式和使用的函數(shù)名都和這個庫一致,那我們是不是可以大膽假設百度整套登錄請求時的流程和這個開源庫基本一致呢,那jsencrypt的流程又是什么樣的呢,如下圖:加密存儲到這里,加密傳輸?shù)倪^程已經完結了,現(xiàn)在服務端已經收到了用戶真實的密碼(解密后的),那怎么存儲這個密碼呢?千萬不要用明文存儲密碼如果用明文存儲密碼(不管是存在數(shù)據(jù)庫還是日志中),一旦數(shù)據(jù)泄露,所有用戶的密碼就毫無保留地暴露在黑客的面前,開頭提到的風險就可能發(fā)生,那我們費半天勁加密傳輸密碼也失去了意義。
用哈希算法加密密碼單向加密算法:只能從明文生成一個對應的哈希值,不能反過來根據(jù)哈希值得到對應的明文。
常用的給密碼加密的算法是幾種單向的哈希算法。
經常被大家用來加密的算法有MD5和SHA系列(如SHA1、SHA256、SHA384、SHA512等)。
雖然用哈希算法能提高密碼存儲的安全性,但還是不夠安全。
通常黑客在侵入保存密碼的數(shù)據(jù)庫之后,他會隨機猜測一個密碼,生成一個哈希值。
如果該哈希值在數(shù)據(jù)庫中存在,那么他就猜對了一個用戶的密碼。
如果沒有猜中也沒有關系,他可以再次隨機猜測下一個密碼進行嘗試。
事實上黑客為了提高破解密碼的效率,他們會事先計算大量密碼對應的各種哈希算法的哈希值,并把密碼及對應的哈希值存入一個表格中(這種表格通常被稱為彩虹表),在破解密碼時只需要到事先準備的彩虹表里匹配即可。
因此現(xiàn)在黑客們破解僅僅只用哈希算法加密過的密碼事實上已是不費吹灰之力。
加“鹽”提高安全性鹽:一個隨機的字符串,往明文密碼里加鹽就是把明文密碼和一個隨機的字符串拼接在一起。
為了應對黑客們用彩虹表破解密碼,我們可以先往明文密碼加鹽,然后再對加鹽之后的密碼用哈希算法加密。
由于鹽在密碼校驗的時候還要用到,因此通常鹽和密碼的哈希值是存儲在一起的。
采用加鹽的哈希算法對密碼加密,要確保要往每個密碼里添加隨機的唯一的鹽,而不是讓所有密碼共享一樣的鹽。
雖然加鹽的算法能有效應對彩虹表的破解法,但它的安全級別并不高,因為計算哈希值耗時極短,黑客仍然可以用窮舉法來破解,只是增加了一些耗時。
用BCrypt或者PBKDF2增加破解的難度為了應對暴力破解法,我們需要非常耗時的而不是非常高效的哈希算法。
BCrypt和PBKDF2算法應運而生。
這兩個算法最大的特點是我們可以通過參數(shù)設置重復計算的次數(shù),重復計算的次數(shù)越多耗時越長。
如果計算一個哈希值需要耗時1秒甚至更多,那么黑客們采用暴利法破解密碼將幾乎不再可能。
破解一個6位純數(shù)字密碼需要耗時11.5天,更不要說高安全級別的密碼了。
Copyright © 2021 深圳市維創(chuàng)信息技術有限公司 版權所有