SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解
2019獨角獸企業重金招聘Python工程師標準>>>
作者:shede333
主頁:http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847
版權聲明:原創文章,版權聲明:自由轉載-非商用-非衍生-保持署名 | [Creative Commons BY-NC-ND 3.0][]
###DES: Digital Encryption Standard. Obsolete standard. 單密鑰算法,是信息的發送方采用密鑰A進行數據加密,信息的接收方采用同一個密鑰A進行數據解密.
單密鑰算法是一個對稱算法. 算法好在加/解速度快,密鑰量短,采用對稱加密
###DSA: Digital Signature Algorithm. based on discrete logarithms computation. 主要用于簽名
在DSA數字簽名和認證中,發送者使用自己的私鑰對文件或消息進行簽名,接受者收到消息后使用發送者的公鑰
DSA只是一種算法,和RSA不同之處在于它不能用作加密和解密,也不能進行密鑰交換,
只用于簽名,它比RSA要快很多.
DSA只能與SHA-1一起使用,而RSA可以與任何摘要算法一起使用。DSA簽名不包括摘要標識符,所以如果允許多種摘要算法就會使DSA遭受前面RSA里面介紹的那種替換攻擊。DSA主要依賴于整數有限域離散對數難題。
與RSA不同的是,RSA是對簽名數據“解密”后再比對摘要值,而DSA中摘要值是需要參與計算的。
###RSA: RSA 是一種非對稱加解密算法。
RSA 與 DSA 都是非對稱加密算法。其中RSA的安全性是基于極其困難的大整數的分解(兩個素數的乘積);DSA 的安全性
是基于整數有限域離散對數難題。基本上可以認為相同密鑰長度的 RSA 算法與 DSA 算法安全性相當。
公鑰用于加密,它是向所有人公開的;私鑰用于解密,只有密文的接收者持有。
DSA 用于簽名,而 RSA 可用于簽名和加密。
**refer: **
DES _百度百科
RSA,DSA等加解密算法介紹_越來越好_新浪博客
DSA與RSA的區別-ad007520-ITPUB博客
非對稱算法-數字簽名算法-DSA
###公鑰、私鑰 的解釋
公鑰 :用于向外發布,任何人都能獲取,
私鑰 :要自己保存,切勿給別人
一下兩種情況經常有人弄混,一定要理解。
情況1:公鑰用于【加密】, 私鑰用于【解密】
如果加密密鑰是公開的,這用于客戶給私鑰所有者上傳加密的數據,這被稱作為公開密鑰加密(狹義)。
例如,網絡銀行的客戶發給銀行網站的賬戶操作的加密數據。HTTPS 等。
情況2:公鑰用于【解密】,私鑰用于【加密】
如果解密密鑰是公開的,用私鑰加密的信息,可以用公鑰對其解密,用于客戶驗證持有私鑰一方發布的數據或文件是完整準確的,接收者由此可知這條信息確實來自于擁有私鑰的某人,這被稱作數字簽名,公鑰的形式就是數字證書。例如,從網上下載的安裝程序,一般都帶有程序制作者的數字簽名,可以證明該程序的確是該作者(公司)發布的而不是第三方偽造的且未被篡改過(身份認證/驗證)。
refer:
公開密鑰加密 - 維基百科,自由的百科全書
數字證書原理
###簽名:
加密后的hash值
這里主要解釋一下簽名,簽名就是在信息的后面再加上一段內容,可以證明信息沒有被修改過,怎么樣可以達到這個效果呢?一般是對信息做一個hash計算得到一個hash值,注意,這個過程是不可逆的,也就是說無法通過hash值得出原來的信息內容。在把信息發送出去時,把這個hash值加密后做為一個簽名和信息一起發出去
###指紋: 指紋算法 即 一個hash算法 ,例如md5算法;
注意,為了保證安全,在證書的發布機構發布證書時,證書的指紋和指紋算法,都會加密后再和證書放到一起發布,以防有人修改指紋后偽造相應的數字證書。這里問題又來了,證書的指紋和指紋算法用什么加密呢?他們是用證書發布機構的私鑰進行加密的。可以用證書發布機構的公鑰對指紋和指紋算法解密,也就是說證書發布機構除了給別人發布證書外,他自己本身也有自己的證書。證書發布機構的證書是哪里來的呢???這個證書發布機構的數字證書(一般由他自己生成)在我們的操作系統剛安裝好時(例如windows xp等操作系統),這些證書發布機構的數字證書就已經被微軟(或者其它操作系統的開發機構)安裝在操作系統中了,微軟等公司會根據一些權威安全機構的評估選取一些信譽很好并且通過一定的安全認證的證書發布機構,把這些證書發布機構的證書默認就安裝在操作系統里面了,并且設置為操作系統信任的數字證書。這些證書發布機構自己持有與他自己的數字證書對應的私鑰,他會用這個私鑰加密所有他發布的證書的指紋作為數字簽名。
refer: 數字簽名是什么?
###公鑰登陸 error
使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登錄,可以省去輸入密碼的步驟。 所謂"公鑰登錄",原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字符串,用戶用自己的私鑰加密后,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。 這種方法要求用戶必須提供自己的公鑰。如果沒有現成的,可以直接用ssh-keygen生成一個:
$ ssh-keygen
refer:
SSH原理與運用(一):遠程登錄 - 阮一峰的網絡日志
localhost:客戶端,
remotehost:服務器
密鑰訪問:localhost通過ssh-keygen來生成公鑰密鑰對,如果他想訪問一個remotehost,則只需要將公鑰添加到 remotehost的~/.ssh/authorized_keys中,接下來,當localhost通過ssh登錄 username@remotehost時,remotehost會生成一個隨機數,通過autrorized_keys中的公鑰們生成一系列數值發給 localhost,localhost會通過自己的私有密鑰解密發過來的一系列數值(當然,只有用對應的公鑰生成的數值才會被正常解密),隨 后,localhost將解密后的數值發回去,remotehost若發現發回來的數值是原先產生的隨機數時,便會允許該localhost訪問。當然, 如果localhost生成的rsa密鑰是需要密碼的話,接下來還要輸入該密碼。
refer:
ssh 密鑰訪問
###SSH基本原理和免密碼登錄
從客戶端來看,SSH提供兩種級別的安全驗證:
第一種級別是基于口令的安全驗證:
(1)遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。
(2)用戶使用這個公鑰,將登錄密碼加密后,發送回來。
(3)遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。
缺點:如果有人冒充服務器,就會給你假服務器公鑰,最后就能獲得你回應的密碼,這就是中間人攻擊。
第二種級別是基于密匙的安全驗證:
前提:客戶端創建一對公鑰+秘鑰,同時將公鑰放在服務器上。
1.客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證; 2. 服務器收到請求之后,先在該服務器上尋找你的公鑰,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用這個公鑰加密一個【隨機字符串】并把它發送給客戶端軟件; 3.客戶端軟件收到【加密后的-隨機字符串】之后,就可以用你的私人密匙解密,再把【隨機字符串】發送給服務器
與第一種級別相比,第二種級別不需要在網絡上傳送口令。第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒,但是相比輸入密碼的方式來說10秒也不長。
refer:
SSH基本原理和免密碼登錄
###公鑰認證的原理
所謂的公鑰認證,實際上是使用一對加密字符串,一個稱為公鑰(public key),任何人都可以看到其內容,用于加密;另一個稱為密鑰(private key),只有擁有者才能看到,用于解密。通過公鑰加密過的密文使用密鑰可以輕松解密,但根據公鑰來猜測密鑰卻十分困難。
ssh 的公鑰認證就是使用了這一特性。服務器和客戶端都各自擁有自己的公鑰和密鑰。為了說明方便,以下將使用這些符號。
Ac 客戶端公鑰
Bc 客戶端密鑰
As 服務器公鑰
Bs 服務器密鑰
在認證之前,客戶端需要通過某種方法將公鑰 Ac 登錄到服務器上。
認證過程分為兩個步驟。
會話密鑰(session key)生成
客戶端請求連接服務器,服務器將 As 發送給客戶端。
服務器生成會話ID(session id),設為 p,發送給客戶端。
客戶端生成會話密鑰(session key),設為 q,并計算 r = p xor q。
客戶端將 r 用 As 進行加密,結果發送給服務器。
服務器用 Bs 進行解密,獲得 r。
服務器進行 r xor p 的運算,獲得 q。
至此服務器和客戶端都知道了會話密鑰q,以后的傳輸都將被 q 加密。
認證
服務器生成隨機數 x,并用 Ac 加密后生成結果 S(x),發送給客戶端
客戶端使用 Bc 解密 S(x) 得到 x
客戶端計算 q + x 的 md5 值 n(q+x),q為上一步得到的會話密鑰
服務器計算 q + x 的 md5 值 m(q+x)
客戶端將 n(q+x) 發送給服務器
服務器比較 m(q+x) 和 n(q+x),兩者相同則認證成功
refer:
ssh 公鑰私鑰認證原理
###非對稱加密
服務器建立公鑰: 每一次啟動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的文件,若系統剛剛安裝完成時,由于沒有這些公鑰,因此 sshd 會主動去計算出這些需要的公鑰,同時也會計算出服務器自己需要的私鑰
*
客戶端主動聯機請求: 若客戶端想要聯機到 ssh 服務器,則需要使用適當的客戶端程序來聯機,包括 ssh, putty 等客戶端程序連接
*
服務器傳送公鑰給客戶端: 接收到客戶端的要求后,服務器便將第一個步驟取得的公鑰傳送給客戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的)
*
客戶端記錄并比對服務器的公鑰數據及隨機計算自己的公私鑰: 若客戶端第一次連接到此服務器,則會將服務器的公鑰記錄到客戶端的用戶家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該服務器的公鑰,則客戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰, 則開始計算客戶端自己的公私鑰
*
回傳客戶端的公鑰到服務器端: 用戶將自己的公鑰傳送給服務器。此時服務器:具有服務器的私鑰與客戶端的公鑰,而客戶端則是: 具有服務器的公鑰以及客戶端自己的私鑰,你會看到,在此次聯機的服務器與客戶端的密鑰系統 (公鑰+私鑰) 并不一樣,所以才稱為非對稱加密系統
*
開始雙向加解密: (1)服務器到客戶端:服務器傳送數據時,拿用戶的公鑰加密后送出。客戶端接收后,用自己的私鑰解密 (2)客戶端到服務器:客戶端傳送數據時,拿服務器的公鑰加密后送出。服務器接收后,用服務器的私鑰解密,這樣就能保證通信安全
refer:
SSH 協議與OpenSSH詳解 - Share your knowledge … - 51CTO技術博客
###SSL/TLS協議
SSL/TLS協議的基本思路是采用公鑰加密法,也就是說,客戶端先向服務器端索要公鑰,然后用公鑰加密信息,服務器收到密文后,用自己的私鑰解密。
SSL/TLS協議(HTTPS 也是這樣的)的基本過程是這樣的:
1.客戶端生成【隨機數1】,客戶端(通常是瀏覽器)先向服務器發出加密通信的請求,發送【隨機數1】,向服務器端索要公鑰; 2.服務器收到客戶端請求后,生成【隨機數2】,向客戶端發出回應,回應信息包括【隨機數2】,服務器證書(包含公鑰) 3.客戶端收到后,驗證服務器證書的有效性,取出公鑰,生成【隨機數3】,使用公鑰加密【隨機數3】,發給服務器。 4.服務器回應, 至此,服務器和客戶端都有3個隨機數,使用3個隨機數生成這次的會話秘鑰(即對稱秘鑰),二者開始使用對稱加密通訊。服務器通知客戶端:編碼改變通知,表示隨后的信息都將用雙方商定的加密方法和密鑰發送。服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗(對稱加密)。 5.之后二者將通過對稱加密來通訊。解釋:為啥使用3個隨機數。
不管是客戶端還是服務器,都需要隨機數,這樣生成的密鑰才不會每次都一樣。由于SSL協議中證書是靜態的,因此十分有必要引入一種隨機因素來保證協商出來的密鑰的隨機性,三個隨機數通過一個密鑰導出器最終導出一個對稱密鑰,增加隨機性
之前很多講HTTPS原理的(包括下面的https),都只有1個隨機數,為啥?因為畢竟是講原理,并沒有講清細節;
簡單來說,一開始使用的非對稱加密,就是為了安全的傳遞對稱秘鑰,畢竟對稱加密的速度快。
refer:
SSL/TLS協議運行機制的概述
###https 非對稱+對稱
refer:
圖解HTTPS 無網不剩
轉載于:https://my.oschina.net/shede333/blog/359290
總結
以上是生活随笔為你收集整理的SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到家里着火了预示着什么
- 下一篇: 梦到老鼠是胎梦吗