1. 程式人生 > >對稱(DES/AES)與非對稱(RSA/SSL/數字證書)加密介紹及實際應用

對稱(DES/AES)與非對稱(RSA/SSL/數字證書)加密介紹及實際應用

行數據 服務端 版本 報道 pass edi 得到 參數 crc

本文不對具體的算法做深入研究,只是講解各種安全算法的原理和使用場景。


一、數據校驗算法

數據校驗,是為保護數據的完整性,用一種指定的算法對原始數據計算出的一個校驗值。當接收方用同樣的算法再算一次校驗值,如果兩次校驗值一樣,表示數據完整。

1、奇偶校驗

能檢測出信息傳輸過程當中的一位誤碼。出現錯誤不能檢測出錯誤,只能要求重發。

2、 CRC循環冗余校驗

通過增加若幹冗余位,可以檢測出傳輸過程中的錯誤。檢錯和糾錯能力強,在通信領域運用較廣泛。

3、MD5校驗

MD5算法是一種信息摘要算法,是通過哈希映射的原理得到一個大文件簡短的MD5值。該算法是一種不可逆算法

,也就是說開發者不能通過MD5值得到原始文件的數據。這裏有一種可能性,不同的數據文件得到相同的MD5值,但是這種情況一般開發過程當中都不予考慮(數據碰撞)。

4、 SHA

SHA(Secure Hash Algorithm)是由美國專門制定密碼算法的標準機構——美國國家標準技術研究院(NIST)制定的,SHA系列算法的摘要長度分別為:SHA為20字節(160位)、SHA256為32字節(256位)、 SHA384為48字節(384位)、SHA512為64字節(512位),由於它產生的數據摘要的長度更長,因此更難以發生碰撞,因此也更為安全,它是未來數據摘要算法的發展方向。由於SHA系列算法的數據摘要長度較長,因此其運算速度與MD5相比,也相對較慢。

同MD5算法相同,他也是一種不可逆的算法


二、對稱加密算法

  • 1、Base64 編解碼

該算法只能稱為一種校驗,是對原始的數據進行了一個編碼的過程。 有編碼就有解碼,該過程是一個可逆的。該算法安全性較差,可以很輕松的通過解碼將密文轉換為明文,從而獲取信息。

  • 2、DES 數據加密算法

是對稱加密算法領域中的典型算法,現在認為是一種不安全的加密算法,因為現在已經有用窮舉法攻破DES密碼的報道了。盡管如此,該加密算法還是運用非常普遍,是一種標準的加密算法。3DES是DES的加強版本。

DES加密的秘鑰是 56位,而3DES加密算法的秘鑰是 112位或者168位。3DES加密處理速度較慢、密鑰計算時間較長、加密效率不高。

  • 3、AES 數據加密算法(推薦使用)

Advanced Encryption Standard ,高級數據加密標準,AES算法可以有效抵制針對DES的攻擊算法。

密鑰建立時間短、靈敏性好、內存需求低、安全性高

DES/3DES/AES 三種加密算法的對比如下:

技術分享圖片

  • 4、異或加密

異或運算中,如果某個字符(或數值)x 與 一個數值m 進行異或運算得到y,則再用y 與 m 進行異或運算就可以還原為 x ,因此應用這個原理可以實現數據的加密解密功能。

這種加密算法較簡單,只是簡單的將明文轉換為不易看出的密文,破解的復雜度完全取決於秘鑰的長度。


三、非對稱加密算法

公開密鑰加密,又稱 asymmetric cryptography (非對稱加密),即存在兩把不同的密鑰,分別稱為公鑰 Pu 和私鑰 Pr,公鑰通常用來加密明文 M,只有私鑰才能解密密文 C,如果用 E 和 D 分別表示加密和解密算法,那麽有:

C = E(M,Pu); // 加密公式,M為明文,C為密文,

M = D(C,Pr); // 解密公式

 技術分享圖片 

傳統的對稱加密需雙方共享相同的密鑰,通信安全很大程度依賴雙方是否能妥善的管理密鑰。公開密鑰加密發明是密碼學最為重要的裏程碑之一,它從數學的角度保證了通信安全。公開密鑰加密體系有三大範疇:

  • Encryption/Decryption:即加密與解密,發送方接收方的公鑰加密消息(秘鑰由接收方生成,傳送給發送方)

  • Digital Signature:數字簽名,發送方用公鑰加密消息摘要生成簽名,保證消息的完整性和可靠性

  • Key Exchange:安全的交換密鑰,通常用於交換對稱加密的密鑰(迪菲-赫爾曼密鑰交換算法)

1、RSA加密

這種算法以歐拉函數為基礎,這裏不具體展開:

這種算法非常可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還無法破解(至少沒人公開宣布,因為大數的因式分解計算量特別大)。因此可以認為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。

具體原理可以見:公鑰私鑰的生成及加解密過程

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.htm

https://www.kancloud.cn/kancloud/rsa_algorithm/48488

2、SSL/TLS協議

具體來說,SSL/TLS 並不是一種算法,而是為了保證通信安全的一種協議,當然裏面用到了相關加密算法如非對稱加密算法、數字證書、HD秘鑰交換算法等。Https多使用這種協議進行網絡數據的傳輸。


技術分享圖片

通過上述這張圖大致了解這種協議的通信過程。上述過程的目的只是為了獲取比較安全的Session Key,當然這個Key需要Client Random + Server Random + Permaster secret 三者共同生成,安全性較高。Session key 用於後面通信對數據進行對稱加密。 雙方獲得Session Key 後通過http協議進行數據傳輸,Session Key 用來對http傳輸的內容進行加密。

關於SSL/TLS的詳細講解請參考 阮一峰的博客鏈接。

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

TOTP

TOTP 的全稱是"基於時間的一次性密碼"(Time-based One-time Password)。它是公認的可靠解決方案,已經寫入國際標準 RFC6238。

它的步驟如下。

第一步:用戶開啟雙因素認證後,服務器生成一個密鑰。

第二步:服務器提示用戶掃描二維碼(或者使用其他方式),把密鑰保存到用戶的手機。也就是說,服務器和用戶的手機,現在都有了同一把密鑰。

第四步,服務器也使用密鑰和當前時間戳,生成一個哈希,跟用戶提交的哈希比對。只要兩者不一致,就拒絕登錄。

註意,密鑰必須跟手機綁定。一旦用戶更換手機,就必須生成全新的密鑰。

算法原理:

TC = floor((unixtime(now) ? unixtime(T0)) / TS)

上面的公式中,TC 表示一個時間計數器,unixtime(now)是當前 Unix 時間戳,unixtime(T0)是約定的起始時間點的時間戳,默認是0,也就是1970年1月1日。TS 則是哈希有效期的時間長度,默認是30秒。因此,上面的公式就變成下面的形式。

TC = floor(unixtime(now) / 30)

所以,只要在 30 秒以內,TC 的值都是一樣的。前提是服務器和手機的時間必須同步。

接下來,就可以算出哈希了。

TOTP = HASH(SecretKey, TC)

TOTP 有硬件生成器和軟件生成器之分,都是采用上面的算法。


數字簽名過程(防止公鑰被偽造 ):

http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

1、通過公鑰私鑰進行加密通信,發送方發送的內容只有通過私鑰才能打開,所以保證了發送信息的私密性。

2、第三方可以把偽造的公鑰給發送方,再截獲發送的信息,通過自己的私鑰解密信息。 這裏Https協議中引入的CA(certificate authority)可以很好的解決這個問題。證書中心用自己的私鑰為傳輸的公鑰和一些信息進行加密,發送者可以通過證書中的公鑰解密證書中的信息,這些信息中包含了需要傳送的公鑰。(暫且認為證書中的信息都是對的,一般證書中心都是可靠性比較高的機構頒發的)

通過Chrome打開百度網頁的時候,F12建, Security菜單欄可以看到百度的證書。證書裏面包含:頒發者、頒給者、公鑰、有效期等信息。


簽名的實際應用

現在有三個參數(A、B、C 封裝在一個類Data中)需要傳輸到服務端,那麽如何保證 這三個數據不是別人偽造發送的,可以在傳這三個數據數據之外再添加一個數據 sign(String類型)。

  客戶端sign的生成算法:

  第一步:對三個參數名稱(與服務端提前約定好傳輸變量的名稱)進行字典排序,拼接成字符串StringA(key1=value1&key2=value2&key3=value3),同時字符串的拼接遵循指定的規則。

  第二步:在stringA最後拼接秘鑰key(只有服務端和客戶端知道,第三方不能獲得,這也是簽名的關鍵)得到finalStringA

  第三部: 對finalStringA 做MD5計算,並將字符數組轉換成16進制的字符串。

    自此sign生成過程結束。

生成根據Data 中A、B、C三個參數的值以及Key 生成了sign之後,將sign值賦給Data中的sign。將Data轉換成JSONObject格式再轉換成字符數組

通過 HttpURLConnection傳送到服務端。服務端通過拿到A、B、C的數值後會自己通過同樣的算法生成sign,如果和客戶端傳送的Sign不一樣則這次傳送可能是第三方偽造的。

  這種簽名就保證了第三方不能偽造數據和服務端進行通信。(具體的流程如下圖所示)

技術分享圖片

但是這裏有個問題,其它人員獲取到了通信秘鑰secret,則可以偽造數據,畢竟客戶端的代碼很有可能被破解的(就算放在native層都可以被破解),但是對於安全等級較低通信這種加密措施也足夠了。

對稱(DES/AES)與非對稱(RSA/SSL/數字證書)加密介紹及實際應用