使用RSA和OpenSSL分享AES密鑰

如果您使用現代的後端開發,則不可避免的是有一天您會將您的應用程序與外部服務集成在一起。當交換的數據包含敏感的信息(例如:用戶的個人信息,公司內部報告)時,對數據進行加密以在出現泄漏或網絡攻擊的情況下提供額外的保護是很重要的。

對稱密碼學

多年來,使用兩方(發送者和接收者)之間的共享密鑰來實現加密。密鑰用於一方加密消息,而另一方解密消息,因此名稱是對稱的。對稱密碼術在當今仍然被廣泛使用,但是它也有一些缺點。

對稱密碼學的缺點

爲了使用對稱密碼建立加密通信,一方必鬚生成密鑰併發送給另一方。在較早的實現中,這是通過個人會議實現的。在在線服務的世界中,這不是可行的選擇,因爲雙方之間的物理距離可能很大,並且實現必須很快。

在線共享密鑰會帶來一些安全風險,就像被能夠攔截郵件的人(例如:具有網絡訪問權限的人員)發現的那樣,此人可以查看原始內容,更改內容,甚至可以作爲原始發件人通過,而任何一方都沒有意識到它(中間人攻擊)。

非對稱密碼學

在非對稱密碼學中,您有一個公鑰/私鑰對,其中一個用於加密消息,另一個用於解密消息。當前,最流行的非對稱密碼算法是RSA(Rivest-Shamir-Adleman),它包括以下原理:

  1. 私鑰是私鑰;
  2. 可以共享公鑰;
  3. 公鑰是從私鑰派生的;
  4. 您無法從公共密鑰中猜出私有密鑰;
  5. 用公鑰加密的消息只能用相應的私鑰解密;
  6. 用私鑰加密的消息只能用相應的公鑰解密。

RSA實施

假設愛麗絲(Alice)想將加密的消息發送給鮑勃(Bob)。雙方使用RSA加密技術,生成一個密鑰對,並與另一方共享其公共密鑰。愛麗絲先用鮑勃的公鑰加密消息,然後再用她的私鑰加密消息,最後纔將消息發送給鮑勃。鮑勃收到加密的消息,然後使用愛麗絲的公鑰解密,然後使用其私鑰解密以獲取原始消息。

爲什麼用私鑰加密?

關於此過程的一個非常普遍的疑問是要理解爲什麼Alice想要使用她的私有密鑰來加密消息,因爲擁有她的公共密鑰的任何人都可以對其進行解密。可以使用愛麗絲的公鑰解密消息的事實確保了可以用她的私鑰對消息進行加密(RSA原則6)。這樣,假設只有愛麗絲知道她的私鑰,那麼鮑勃可以驗證該消息是由愛麗絲髮送的。此過程稱爲對消息簽名。

爲什麼不僅僅使用RSA加密

RSA並非旨在處理大量數據。在這種情況下,建議使用諸如AES(高級加密標準)之類的對稱算法。

這是RSA和AES算法的比較,該算法用於使用Go加密和解密具有名稱,電子郵件和年齡列的100.000行csv文件。該存儲庫中可用的代碼。

RSA 加密:30.31 s
解密:569.62 s

AES 加密:1.36 s
解密:1.20 s

密碼學被應用於文本值,而不是直接應用於文件。請記住,這些值可能會因您使用的實現而異。在這種情況下,使用的是帶有OAEP(最佳非對稱加密填充)和SHA256哈希的RSA ,以及帶有GCM(伽羅瓦/計數器模式)的AES 。

AES + RSA

解決此問題的常用方法是使用AES加密/解密所需的內容,並使用RSA共享AES密鑰。這樣,您可以利用AES效率,同時最大程度地降低其負面影響(發送密鑰)。

使用OpenSSL的AES + RSA實現

OpenSSL是用於TLS(傳輸層安全性)和SSL(安全套接字層)協議以及通用加密庫的健壯的,商業級,功能齊全的工具包。之所以選擇在本文中使用OpenSSL,是因爲它是一種廣泛使用的工具,已在所有平臺上使用了很多年。

下面是在UNIX系統中使用OpenSSL實施AES和RSA在Alice和Bob之間建立加密通信的步驟。

1.生成RSA密鑰對

愛麗絲會生成一個私鑰文件private.pem

openssl genrsa -out private.pem

考慮到蠻力攻擊的計算能力,當今RSA密鑰的建議大小爲2048位,這是此命令的默認值。

愛麗絲將私鑰(RSA原則3)中的公鑰提取到另一個文件public.pem中

openssl rsa -in private.pem -pubout -out public.pem

2.交換公鑰

愛麗絲(Alice)和鮑勃(Bob)彼此共享他們的公共pem文件。

2048位RSA密鑰可以長時間重複使用,但建議每年至少更換一次,具體取決於第三方破解它的興趣。

3.生成AES密鑰

在此示例中,AES算法與256位CBC(密碼塊鏈接)操作模式一起使用。此模式需要一個32字節的密鑰和一個16字節的初始化向量iv)。Alice以十六進制格式生成密鑰和iv,並將其存儲在變量中以備後用。

AES_KEY=$(openssl rand -hex 32)
AES_IV=$(openssl rand -hex 16)

理想情況下,在每次使用時你應該產生一個新的key/iv對,但你可以重複使用一段時間,只更改的關鍵iv這並不需要加密。

OpenSSL加密功能不支持GCM操作模式。

4.使用AES密鑰加密數據

愛麗絲會對要發送給鮑勃的文本文件data.csv進行加密。

openssl enc -aes-256-cbc -K $ AES_KEY -iv $ AES_IV -in data.csv -out data.csv.enc

5.用RSA加密AES密鑰

Alice使用Bob的公鑰將AES密鑰加密到文件aes_key.enc中

echo $AES_KEY | openssl rsautl -encrypt -pubin -inkey public.pem -oaep -out aes_key.enc

參數-oaep指定建議使用OAEP填充。

6.簽名消息

愛麗絲使用她的私鑰從aes_key.enc創建簽名文件aes_key.enc.sig

openssl dgst -sha256 -sign private.pem -out aes_key.enc.sig aes_key.enc

7.發送加密的數據,加密的AES密鑰,簽名和iv**

Alice將AES加密的數據文件data.csv.env,AES加密密鑰aes_key.enc,簽名文件aes_key.enc.sig和純文本iv發送給Bob。

8.驗證簽名

Bob通過檢查aes_key.enc文件哈希是否與用Alice的公鑰解密的簽名文件匹配來驗證接收到的數據是否來自Alice 。

openssl dgst -sha256-驗證public.pem-簽名aes_key.enc.sig aes_key.enc

參數-sha256指定用於加密文件的哈希算法。

9.解密AES密鑰

鮑勃使用他的私鑰解密aes_key.enc文件,以獲取由愛麗絲生成的AES密鑰。

AES_KEY = $(openssl rsautl -decrypt -inkey private.pem -in aes_key.enc)

10.解密數據

Bob解密data.csv.enc文件並獲取原始文件內容。

openssl enc -d -aes-256-cbc -K $ AES_KEY -iv $ AES_IV -in data.csv.enc -out data.csv

結論

AES是用於大文件加密的有效算法,但是共享密鑰存在安全風險。最小化此風險的一種方法是使用RSA算法發送密鑰。OpenSSL爲此邏輯提供了一種簡單的加密實現,可以實現自動化。

參考

Sharing AES Key using RSA with OpenSSL



作者:魂鬥驢
鏈接:https://www.jianshu.com/p/51957b255f9c
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章