RSA/SHA1加密和數字簽名算法在開放平臺中的應用

加密算法

加密算法分爲兩大類:1.對稱加密算法;2.非對稱加密算法。javascript

  密鑰個數 加密 解密
對稱加密 一個 使用密鑰加密 使用同一個密鑰解密
非對稱加密 兩個,公鑰和私鑰 使用其中一把密鑰加密 使用另一把密鑰解密

RSA非對稱加密算法

  • RSA是目前應用最普遍的非對稱加密算法,各類語言都支持RSA算法,如Java,Python,C++(openssl),Go(openssl),PHP(openssl),Object-C,Android,javascript等。
  • 對於一個私鑰匙、有且只有一個與之對應的公鑰。公/私鑰的主流可選位長度爲102四、204八、307二、4096....,越長安全係數越高。私鑰加密的內容,使用公鑰可以解密,一樣使用公鑰加密的內容,使用私鑰也能解密。
  • 在linux系統下,有兩種經常使用的工具用於生成RSA密鑰對,ssh-keygen和openssl genrsa。
  • RSA是一個可以同時用於加密和數字簽名的算法,典型的應用場景:隱藏原文、防止原文被篡改、身份認證。隱藏原文是全部加密算法的通用功能(要否則怎麼叫加密),防止原文被篡改是數字簽名的功能,數據傳輸的具體流程以下:java

    1. 甲方構建密鑰對,將公鑰交給乙方
    2. 甲方使用私鑰加密原文,而後將加密數據發送給乙方。乙方使用公鑰對簽名進行解密,獲取原文,若是解密失敗,則原文被篡改。
    3. 乙方給甲方發送原文的時候,先使用公鑰對原文加密,將加密數據發送給甲方。甲方使用私鑰對簽名解密,獲取原文,若是解密失敗,則原文被篡改。
  • 若是第三方不知道密鑰對,則第三方什麼都作不了。若是第三方知道公鑰,則第三方對甲方的原文具備與乙方同樣的閱讀權限,但沒法篡改甲方的原文,由於沒有私鑰,沒法生成合法的數字簽名。
  • RSA對一次加密的明文的長度是有要求的,在不一樣的padding模式下,能加密的明文長度也不相同。以RSA 1024爲例,輸入的明文的字節數不能超過鑰模長1024bits,即最長爲128bytes。RSA 1024的不一樣padding模式下的明文長度的最大值計算公式:linux

    1. RSA_PKCS1_PADDING RSA_size(1024) - 11 = 117bytes
    2. RSA_PKCS1_OAEP_PADDING RSA_size(1024) - 41 = 87bytes
    3. RSA_NO_PADDING RSA_size(1024) = 128bytes
  • 因爲RSA等非對稱加密算法對原文長度有限制,且算法效率沒有對稱加密高,在實際應用中一般被用於傳遞對稱加密算法的密鑰(一般是一個隨機值),而後通訊雙方使用對稱加密算法保證數據安全。

數字簽名

數字簽名是一份數據通過特定的算法計算後得出的特殊標識,用來防止數據在傳輸過程當中被僞造或篡改,是非對稱加密技術與數字摘要技術的綜合應用。算法

數字摘要

  • 數字摘要指能夠將任意長度的數據,經過一個摘要算法計算獲得的固定長度的數據。也就是說摘要算法能夠將很長的數據變爲一個固定長度的數據,一般計算得出的數據要比原始數據短得多,因此被稱爲‘摘要’,典型的摘要算法有MD5和SHA1。
  • 數字摘要算法具備如下重要特性:後端

    1. 原數據不一樣,計算獲得的摘要必定不一樣,反之,原數據不變,計算獲得的摘要必定相同。
    2. 沒法經過摘要逆運算得到原數據,即摘要計算不可逆。
    3. 任意長度的輸入數據,通過計算都會得出固定長度的摘要。

加密算法和摘要算法的區別

  • 加密後的密文可使用對應的密鑰進行解密,獲取原文;摘要是不能進行逆向解密的
  • 加密以後的密文的長度不定;摘要的長度是肯定的
  • 非對稱加密對明文的長度有限制;摘要對明文長度無限制

應用場景

  • 非對稱加密技術可以確保只有持有密鑰對的雙方纔能獲取到正確的數據,但對加密原文的長度有限制,而數字摘要算法可以將輸入數據轉換爲固定長度的摘要,並保證在原數據不變的狀況下,摘要計算結果是一致的。這兩項技術的特性的結合,就造成了數字簽名的經典應用場景:安全

    1. 發送者使用MD5(或SHA1)算法提起原文摘要,而後使用私鑰對摘要進行加密,把密文與原文一塊兒傳送給接收者。
    2. 接收者使用公鑰對密文進行解密,得到摘要,而後使用與發送者同樣的摘要算法MD5(或SHA1)對原文提取摘要,比較兩個摘要是否相等
    3. 摘要相等,說明原文完整且沒有被篡改;不相等,說明原文不正確。
  • 數字簽名有兩種做用:1. 在私鑰沒有泄漏的狀況下,可以確保數據是由發送方簽名發送的。 2.可以確保數據是完整的且沒有被篡改。可是數據自己是否加密,並非數字簽名的做用範疇,由於加密的是摘要,並非數據自己。

    RSA和數字簽名在Https協議通訊中有經典的應用,這裏再也不贅述。ruby

RSA和數字簽名在開放平臺中的應用

在開放平臺中,RSA和數字簽名多用於開發者接入的身份驗證。app

RSA的應用

  • 獨立開發者接入平臺時,使用RSA算法做爲開發者身份驗證的核心算法,如雲信通IM平臺即便用此種模式。開發者接入平臺時,須要以下幾個步驟:ssh

    1. 建立一個應用app,平臺會分配一個SDKAPPID
    2. 將SDKAPPID關聯到一對RSA的公鑰和私鑰上,公鑰和私鑰由平臺生成
    3. 由雲信通IM平臺持有公鑰,開發者持有私鑰
    4. 開發者的服務每次調用平臺接口時,須要攜帶使用指定參數和私鑰生成的簽名,生成簽名的公式爲:RSA(私鑰,SDKAPPID,用戶id)
    5. 雲平臺會驗證每次接口調用中傳入的簽名和用戶id,首先使用公鑰對簽名解密,而後驗證SDKAPPID是否合法,比對用戶id,保證用戶id不會被篡改。
    6. 每一個簽名具備默認的有效期,也就是說,在私鑰不變的狀況下,一個用戶的簽名在有效期內是能夠反覆使用的
  • 在獨立開發者接入平臺的場景中,開發者本身須要保證私鑰的安全,且用戶登錄的驗證由開發者的後端服務來執行,平臺並不負責驗證用戶是否登錄,平臺僅須要驗證服務的調用方是不是合法的開發者。經典的交互流程以下所示:

加密算法-開發者模式.png

數字簽名的應用

  • SHA1哈希算法生成數字簽名也被應用於獨立開發者接入模式,如融雲開放平臺、網易雲信就使用此模式。開發者接入平臺時,須要以下幾個步驟:工具

    1. 開發者申請接入平臺,由平臺分配AppKey和Secret,Secret由開發者確保安全
    2. 在全部平臺服務端 API 接口的請求中,都須要附帶如下4個HTTP Request Header:

      | 名稱| 類型 | 說明 | | AppKey | String | 平臺分配的 App Key | | Nonce| String | 隨機數,長度無限制 | | Timestamp | String | 時間戳 | | Signature | String | 數字簽名 | 
    3. 數字簽名是用於檢驗開發者是否合法的關鍵,其生成方式爲:App Secret、Nonce (隨機數)、Timestamp (時間戳)三個字符串按前後順序拼接成一個字符串並進行 SHA1 哈希計算。
  • 這種開發者接入模式中,數字簽名起到幾個做用:

    1. 用於驗證開發者的合法性
    2. 用於保證關鍵參數如AppKey,Timestamp不被篡改(前提是開發者保證了Secret的安全)
    3. SHA1沒有明文長度的限制,這也是其比RSA算法有優點的地方,但SHA1算法是摘要算法,其計算出來的結果是沒法解密的。

相關文章
相關標籤/搜索