淺析AES和RSA加密演算法的區別和適用場景
資訊資料傳輸的安全一直都是個很重要的話題,從剛開始當程式設計師時錯以為MD5、SHA1這些雜湊演算法就是加密演算法,到後來慢慢接觸對稱加密、非對稱加密這些概念,再到對接各種大開發平臺介面的時候看到他們通過 RSA 進行簽名配合 AES 加密報文這些方式防止介面引數被篡改和資訊洩露。今天就簡單的梳理一下兩種加密演算法的區別和各自適用的場景。
加密演算法的分類
加密的基本思想是將資料轉換成一種掩蓋了原始含義的形式,只有經過適當授權的人才能解密。使用相同或不同的金鑰對資料進行加解密,如果加密和解密使用相同的金鑰,則稱該過程是對稱的。如果使用不同的金鑰,則該過程被定義為非對稱的。
當今使用最廣泛的兩種加密演算法是 AES 和 RSA。兩者都非常有效和安全,但它們通常以不同的方式使用。
AES 加密
AES 演算法依次對每個 128 位資料塊應用一系列數學變換。由於這種方法的計算要求較低,AES 可用於膝上型電腦和智慧手機等消費類裝置上進行資料加密,以及快速加密大量資料。
AES 是一種對稱演算法,它使用相同的 128、192 或 256 位金鑰進行加密和解密。128、192 或 256 位的金鑰可以理解為分別對應16、24和32個位元組的16進位制字串金鑰,AES 系統的安全性會隨金鑰長度呈指數增長。
即使使用 128 位金鑰,通過對 2128 個可能的金鑰值進行暴力列舉,來嘗試破解 AES加密後的資料的任務也是個非常計算密集型的任務。事實上,AES 從未被破解,並且根據當前的技術趨勢,預計在未來幾年內仍將保持安全。
RSA 加密
RSA 以麻省理工學院的科學家(Rivest、Shamir 和 Adleman)的名字命名, 於1977 年首次公佈。它是一種非對稱演算法,它使用公開的已知金鑰進行加密,但需要另外一個不同的金鑰進行解密,這個不同的金鑰只有預期的接收者知道。
網上不少例子說的是公鑰用於加密,私鑰用於解密,其實這個說法不對, 私鑰和公鑰是一對,都可以加解密,配對使用,只不過公鑰可以公佈出去,而私鑰是持有者自己保留的 。
一般的用法是私鑰加密用於簽名防資料被篡改,公鑰加密用於加密防敏感資訊,防止洩露。
-
私鑰加密公鑰解密,能證明“私鑰擁有者” 的唯一身份,用於簽名。
-
公鑰加密私鑰解密,確保傳送的資訊,只有"私鑰擁有者"能夠解密。
這塊先賣個關子,理解不了的話後面給大家介紹開放平臺API驗籤和加密流程的時候再給大家細講。
RSA 演算法需要的計算量比 AES 高,但速度要慢得多。它比較適合用於加密少量資料。
RSA和AES結合使用
AES 演算法的一個主要問題是,作為一種對稱演算法,它要求加密方和解密方使用相同的金鑰。這就產生了一個關鍵的金鑰管理問題——如何將非常重要的金鑰分發給分佈在世界各地的授權接收者,而不會冒在傳輸途中某個地方考慮不周導致金鑰洩露的巨大風險?答案是結合 AES 和 RSA 加密的優勢。
在包括網際網路在內的許多現代通訊環境中,大量交換的資料都通過快速 AES 演算法進行加密。為了獲得解密資料所需的金鑰, 授權接收者釋出一個公鑰,同時保留一個只有他們知道的相關私鑰。然後,傳送方使用該公鑰對他們自己的 AES 金鑰進行RSA加密傳輸給接收方 ,接收方使用私鑰解密得到AES金鑰,再用該金鑰對資料進行解密。
- END -
掃碼關注公眾號「網管叨bi叨」
給網管個星標,第一時間吸我的知識 :point_up_2:
網管為大家整理了一本超實用的《Go 開發參考書》收集了70多條開發實踐。去公眾號回覆【gocookbook】即刻領取!
覺得有用就點個在看 :point_down::point_down::point_down:
- 推薦一個能在線上用的 Go Debug 庫
- 微服務架構下的熔斷框架:hystrix-go
- Go 觸發 GC 的時機有哪些?能手動觸發嗎?
- 會動的圖解 | 既然IP層會分片,為什麼TCP層也還要分段?
- Go 語言裡怎麼正確實現列舉?答案藏著官方的原始碼裡
- 能從入門到精通的 Docker 學習指南
- 微服務難點剖析 | 服務拆的挺爽,問題是日誌該怎麼串聯起來呢?
- 夜讀原始碼,帶你探究 Go 語言的iota
- Go語言如何操縱Kafka才能保證訊息不丟?
- 資料結構--Go 語言中 Set 的最佳實現方案
- 寫給學弟們程式設計入門時必須掌握的HTTP基礎知識總結
- 用資料說話,Go 所有字串拼接方式裡哪種才是最穩定高效的?
- Go 服務進行自動取樣效能分析的方案設計與實現
- Go 除了泛型外最值得期待的新功能,模糊測試
- Go 到底算不算一門面向物件的程式語言
- 萬字長文剖析清楚 Go 語言 defer 原理
- 這個認證申請下來Goland IDEA 等全系產品免費使用 | 附申請說明
- 動圖圖解 | Go 的 timer 是如何被Runtime排程的?
- 長挺醜,Go 最新的泛型型別約束語法介紹
- 簡單易懂的 Raft 分散式共識演算法講義