使用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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章