加密算法分爲兩大類:1.對稱加密算法;2.非對稱加密算法。javascript
密鑰個數 | 加密 | 解密 | |
---|---|---|---|
對稱加密 | 一個 | 使用密鑰加密 | 使用同一個密鑰解密 |
非對稱加密 | 兩個,公鑰和私鑰 | 使用其中一把密鑰加密 | 使用另一把密鑰解密 |
RSA是一個可以同時用於加密和數字簽名的算法,典型的應用場景:隱藏原文、防止原文被篡改、身份認證。隱藏原文是全部加密算法的通用功能(要否則怎麼叫加密),防止原文被篡改是數字簽名的功能,數據傳輸的具體流程以下:java
RSA對一次加密的明文的長度是有要求的,在不一樣的padding模式下,能加密的明文長度也不相同。以RSA 1024爲例,輸入的明文的字節數不能超過鑰模長1024bits,即最長爲128bytes。RSA 1024的不一樣padding模式下的明文長度的最大值計算公式:linux
數字簽名是一份數據通過特定的算法計算後得出的特殊標識,用來防止數據在傳輸過程當中被僞造或篡改,是非對稱加密技術與數字摘要技術的綜合應用。算法
數字摘要算法具備如下重要特性:後端
非對稱加密技術可以確保只有持有密鑰對的雙方纔能獲取到正確的數據,但對加密原文的長度有限制,而數字摘要算法可以將輸入數據轉換爲固定長度的摘要,並保證在原數據不變的狀況下,摘要計算結果是一致的。這兩項技術的特性的結合,就造成了數字簽名的經典應用場景:安全
RSA和數字簽名在Https協議通訊中有經典的應用,這裏再也不贅述。ruby
在開放平臺中,RSA和數字簽名多用於開發者接入的身份驗證。app
獨立開發者接入平臺時,使用RSA算法做爲開發者身份驗證的核心算法,如雲信通IM平臺即便用此種模式。開發者接入平臺時,須要以下幾個步驟:ssh
SHA1哈希算法生成數字簽名也被應用於獨立開發者接入模式,如融雲開放平臺、網易雲信就使用此模式。開發者接入平臺時,須要以下幾個步驟:工具
在全部平臺服務端 API 接口的請求中,都須要附帶如下4個HTTP Request Header:
| 名稱| 類型 | 說明 | | AppKey | String | 平臺分配的 App Key | | Nonce| String | 隨機數,長度無限制 | | Timestamp | String | 時間戳 | | Signature | String | 數字簽名 |
這種開發者接入模式中,數字簽名起到幾個做用:
SHA1沒有明文長度的限制,這也是其比RSA算法有優點的地方,但SHA1算法是摘要算法,其計算出來的結果是沒法解密的。