使用 OpenSSL 加密和解密文件

OpenSSL 是一个实用的工具,可确保您的敏感和秘密消息不会被外人打开。
93 位读者喜欢这个。
Improve your DevOps security game with Ansible Vault

Opensource.com

加密是一种编码消息的方式,使其内容免受窥探。有两种通用类型

  1. 密钥或对称加密
  2. 公钥或非对称加密

密钥加密对加密和解密使用相同的密钥,而公钥加密对加密和解密使用不同的密钥。每种方法都有优点和缺点。密钥加密速度更快,而公钥加密更安全,因为它解决了围绕安全共享密钥的担忧。将它们结合使用可以最佳地利用每种类型的优势。

公钥加密

公钥加密使用两组密钥,称为密钥对。一个是公钥,可以自由地与您想秘密交流的任何人共享。另一个是私钥,应该是秘密的,永远不要共享。

公钥用于加密。如果有人想与您秘密交流信息,您可以将您的公钥发送给他们,他们可以使用公钥在将消息或文件发送给您之前对其进行加密。私钥用于解密。您解密发件人加密消息的唯一方法是使用您的私钥。因此,描述符为“密钥对”;这组密钥是紧密相关的。

如何使用 OpenSSL 加密文件

OpenSSL 是一个了不起的工具,可以完成各种任务,包括加密文件。此演示使用安装了 OpenSSL 的 Fedora 机器。该工具通常由大多数 Linux 发行版默认安装;如果未安装,您可以使用软件包管理器安装它

$ cat /etc/fedora-release 
Fedora release 33 (Thirty Three)
$ 
alice $ openssl version
OpenSSL 1.1.1i FIPS  8 Dec 2020
alice $ 

为了探索文件加密和解密,假设有两位用户 Alice 和 Bob,他们想通过使用 OpenSSL 交换加密文件来相互通信。

步骤 1:生成密钥对

在您可以加密文件之前,您需要生成一对密钥。您还需要一个密码,每次使用 OpenSSL 时都必须使用该密码,因此请务必记住它。

Alice 使用以下命令生成她的密钥对:

alice $ openssl genrsa -aes128 -out alice_private.pem 1024

此命令使用 OpenSSL 的 genrsa 命令生成一个 1024 位的公钥/私钥对。这是可能的,因为 RSA 算法是非对称的。它还使用 aes128(一种对称密钥算法)来加密 Alice 使用 genrsa 生成的私钥。

输入命令后,OpenSSL 会提示 Alice 输入密码,每次她想使用密钥时都必须输入密码

alice $ openssl genrsa -aes128 -out alice_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..........+++++
..................................+++++
e is 65537 (0x010001)
Enter pass phrase for alice_private.pem:
Verifying - Enter pass phrase for alice_private.pem:
alice $ 
alice $ 
alice $ ls -l alice_private.pem 
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
alice $ 
alice $ file alice_private.pem 
alice_private.pem: PEM RSA private key
alice $ 

Bob 遵循相同的步骤来创建他的密钥对

bob $ openssl genrsa -aes128 -out bob_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..................+++++
............................+++++
e is 65537 (0x010001)
Enter pass phrase for bob_private.pem:
Verifying - Enter pass phrase for bob_private.pem:
bob $ 
bob $ ls -l bob_private.pem 
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
bob $ 
bob $ file bob_private.pem 
bob_private.pem: PEM RSA private key
bob $

如果您对密钥文件的外观感到好奇,可以打开该命令生成的 .pem 文件——但您只会看到屏幕上的一堆文本

alice $ head alice_private.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9

pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkL
JJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M
/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeM
e+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcv
Bmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEF
pyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBz
alice $ 

要查看密钥的详细信息,您可以使用以下 OpenSSL 命令输入 .pem 文件并显示内容。您可能想知道在哪里找到另一个密钥,因为这是一个单独的文件。这是一个很好的观察。以下是如何获取公钥

alice $ openssl rsa -in alice_private.pem -noout -text
Enter pass phrase for alice_private.pem:
RSA Private-Key: (1024 bit, 2 primes)
modulus:
    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
    65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0:
    e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b:
    6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4:
    db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3:
    ff:1b:12:af:53:22:c0:41:51
publicExponent: 65537 (0x10001)

<< snip >>

exponent2:
    6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96:
    33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84:
    a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b:
    96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98:
    76:ca:59:e1
coefficient:
    68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30:
    6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df:
    12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e:
    47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c:
    e3:64:90:26
alice $

步骤 2:提取公钥

请记住,公钥是您可以自由与他人共享的密钥,而您必须将私钥保密。因此,Alice 必须提取她的公钥并使用以下命令将其保存到文件中

alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem
Enter pass phrase for alice_private.pem:
writing RSA key
alice $ 
alice $ ls -l *.pem
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
-rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem
alice $

您可以像以前一样查看公钥详细信息,但这次输入公钥 .pem 文件

alice $ 
alice $ openssl rsa -in alice_public.pem -pubin -text -noout
RSA Public-Key: (1024 bit)
Modulus:
    00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
    47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
    c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
    81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
$

Bob 可以按照相同的过程提取他的公钥并将其保存到文件中

bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem
Enter pass phrase for bob_private.pem:
writing RSA key
bob $ 
bob $ ls -l *.pem
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
-rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem
bob $

步骤 3:交换公钥

在 Alice 和 Bob 相互交换公钥之前,这些公钥对他们来说用处不大。有几种方法可以共享公钥,包括使用 scp 命令将密钥复制到彼此的工作站。

将 Alice 的公钥发送到 Bob 的工作站

 alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/

将 Bob 的公钥发送到 Alice 的工作站

bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/

现在,Alice 拥有 Bob 的公钥,反之亦然

alice $ ls -l bob_public.pem 
-rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem
alice $
bob $ ls -l alice_public.pem 
-rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem
bob $

步骤 4:使用公钥交换加密消息

假设 Alice 需要与 Bob 秘密通信。她将她的秘密消息写入文件并将其保存到 top_secret.txt。由于这是一个常规文件,任何人都可以打开它并查看其内容。这里没有太多保护

alice $ 
alice $ echo "vim or emacs ?" > top_secret.txt
alice $ 
alice $ cat top_secret.txt 
vim or emacs ?
alice $

要加密这条秘密消息,Alice 需要使用 openssls -encrypt 命令。她需要向该工具提供三个输入

  1. 包含秘密消息的文件名
  2. Bob 的公钥(文件)
  3. 将存储加密消息的文件名
alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc
alice $ 
alice $ ls -l top_secret.*
-rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc
-rw-rw-r--. 1 alice alice  15 Mar 22 17:53 top_secret.txt
alice $ 
alice $

加密后,原始文件仍然可查看,而新创建的加密文件在屏幕上看起来像乱码。您可以确信秘密消息已被加密

alice $ cat top_secret.txt 
vim or emacs ?
alice $ 
alice $ cat top_secret.enc
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $ 
alice $ 
alice $ 
alice $ hexdump -C ./top_secret.enc 
00000000  9e 73 12 8f e3 75 4d 29  4d 26 3e bf 80 4e a0 c5  |.s...uM)M&>..N..|
00000010  7d 64 6d 43 79 39 32 23  31 58 ce 71 f3 ba 95 a6  |}dmCy92#1X.q....|
00000020  c0 c0 76 17 fb f7 bf 4d  ce fc 40 e6 f4 45 7f db  |..v....M..@..E..|
00000030  7e ae c0 31 f8 6b 10 06  7e 26 50 55 b5 05 56 68  |~..1.k..~&PU..Vh|
00000040  48 4c eb 40 5e 50 fe 19  ea 28 a8 b8 7a 13 69 d7  |HL.@^P...(..z.i.|
00000050  4d b0 34 70 d8 65 d5 07  95 67 2b 52 ea 31 aa d4  |M.4p.e...g+R.1..|
00000060  80 b3 a8 ec a1 73 ed a7  f9 17 c3 13 d4 fa c1 71  |.....s.........q|
00000070  5f 38 b9 6c 07 72 81 a6  fe af 43 a6 49 2d c4 ee  |_8.l.r....C.I-..|
00000080
alice $ 
alice $ file top_secret.enc 
top_secret.enc: data
alice $

删除包含秘密消息的原始文件以删除其任何痕迹是安全的

alice $ rm -f top_secret.txt 

现在 Alice 需要通过网络将此加密文件发送给 Bob,再次使用 scp 命令将文件复制到 Bob 的工作站。请记住,即使文件被拦截,其内容也是加密的,因此内容无法泄露

alice $  scp top_secret.enc bob@bob-machine-or-ip:/path/

如果 Bob 使用常用方法尝试打开和查看加密消息,他将无法读取它

bob $ ls -l top_secret.enc 
-rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc
bob $ 
bob $ cat top_secret.enc 
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $ 
bob $ 
bob $ hexdump -C top_secret.enc 
00000000  9e 73 12 8f e3 75 4d 29  4d 26 3e bf 80 4e a0 c5  |.s...uM)M&>..N..|
00000010  7d 64 6d 43 79 39 32 23  31 58 ce 71 f3 ba 95 a6  |}dmCy92#1X.q....|
00000020  c0 c0 76 17 fb f7 bf 4d  ce fc 40 e6 f4 45 7f db  |..v....M..@..E..|
00000030  7e ae c0 31 f8 6b 10 06  7e 26 50 55 b5 05 56 68  |~..1.k..~&PU..Vh|
00000040  48 4c eb 40 5e 50 fe 19  ea 28 a8 b8 7a 13 69 d7  |HL.@^P...(..z.i.|
00000050  4d b0 34 70 d8 65 d5 07  95 67 2b 52 ea 31 aa d4  |M.4p.e...g+R.1..|
00000060  80 b3 a8 ec a1 73 ed a7  f9 17 c3 13 d4 fa c1 71  |.....s.........q|
00000070  5f 38 b9 6c 07 72 81 a6  fe af 43 a6 49 2d c4 ee  |_8.l.r....C.I-..|
00000080
bob $ 

步骤 5:使用私钥解密文件

Bob 需要通过使用 OpenSSL 解密消息来完成他的工作,但这次使用 -decrypt 命令行参数。他需要向实用程序提供以下信息

  1. 加密文件(他从 Alice 那里得到的)
  2. Bob 自己的私钥(用于解密,因为它使用 Bob 的公钥加密)
  3. 通过重定向保存解密输出的文件名
bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt
Enter pass phrase for bob_private.pem:
bob $

Bob 现在可以阅读 Alice 发给他的秘密消息了

bob $ ls -l top_secret.txt 
-rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt
bob $ 
bob $ cat top_secret.txt 
vim or emacs ?
bob $ 

Bob 需要回复 Alice,所以他将他的秘密回复写入文件

bob $ echo "nano for life" > reply_secret.txt
bob $ 
bob $ cat reply_secret.txt 
nano for life
bob $ 

步骤 6:使用另一个密钥重复该过程

为了发送他的消息,Bob 遵循了 Alice 使用的相同过程,但由于消息是发给 Alice 的,他使用 Alice 的公钥加密文件

bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc
bob $ 
bob $ ls -l reply_secret.enc 
-rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc
bob $ 
bob $ cat reply_secret.enc 
�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
                                                 �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $ 
bob $ 
bob $ hexdump -C ./reply_secret.enc 
00000000  92 46 dd 87 04 bc a7 2e  34 22 01 66 1a 13 31 db  |.F......4".f..1.|
00000010  c4 5c b4 8e 7b 6f d4 b0  24 d2 4d 92 9b 49 7b 35  |.\..{o..$.M..I{5|
00000020  da 7c ee 5c bb 6c cd 82  f1 1b 92 65 f1 8d f2 59  |.|.\.l.....e...Y|
00000030  82 56 81 80 7b 89 07 7c  21 24 63 5e 61 0c ae 2a  |.V..{..|!$c^a..*|
00000040  d4 aa 5c 76 51 8d cf a0  39 04 c1 d7 dc f0 ad 99  |..\vQ...9.......|
00000050  27 ed 8e de d9 ae 02 73  50 e0 dd 27 13 ae 8e 5a  |'......sP..'...Z|
00000060  12 e4 9a 31 57 b3 03 6e  dd e1 16 7f 6b c0 b3 8b  |...1W..n....k...|
00000070  4a cf 30 b8 49 3b 50 38  e0 9f 84 f6 83 da 26 3a  |J.0.I;P8......&:|
00000080
bob $ 
bob $ # remove clear text secret message file
bob $ rm -f reply_secret.txt

Bob 通过 scp 将加密文件发回 Alice 的工作站

$ scp reply_secret.enc alice@alice-machine-or-ip:/path/

如果 Alice 尝试使用普通工具读取加密文本,她将无法理解

alice $ 
alice $ ls -l reply_secret.enc 
-rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc
alice $ 
alice $ cat reply_secret.enc 
�F݇��.4"f�1��\��{o԰$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
                                                 �*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $ 
alice $ 
alice $ 
alice $ hexdump -C ./reply_secret.enc 
00000000  92 46 dd 87 04 bc a7 2e  34 22 01 66 1a 13 31 db  |.F......4".f..1.|
00000010  c4 5c b4 8e 7b 6f d4 b0  24 d2 4d 92 9b 49 7b 35  |.\..{o..$.M..I{5|
00000020  da 7c ee 5c bb 6c cd 82  f1 1b 92 65 f1 8d f2 59  |.|.\.l.....e...Y|
00000030  82 56 81 80 7b 89 07 7c  21 24 63 5e 61 0c ae 2a  |.V..{..|!$c^a..*|
00000040  d4 aa 5c 76 51 8d cf a0  39 04 c1 d7 dc f0 ad 99  |..\vQ...9.......|
00000050  27 ed 8e de d9 ae 02 73  50 e0 dd 27 13 ae 8e 5a  |'......sP..'...Z|
00000060  12 e4 9a 31 57 b3 03 6e  dd e1 16 7f 6b c0 b3 8b  |...1W..n....k...|
00000070  4a cf 30 b8 49 3b 50 38  e0 9f 84 f6 83 da 26 3a  |J.0.I;P8......&:|
00000080
alice $ 

因此,她使用 OpenSSL 解密消息,只是这次她提供了她的私钥并将输出保存到一个文件

alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt
Enter pass phrase for alice_private.pem:
alice $ 
alice $ ls -l reply_secret.txt 
-rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt
alice $ 
alice $ cat reply_secret.txt 
nano for life
alice $

了解更多关于 OpenSSL 的信息

OpenSSL 是一个真正的瑞士军刀实用程序,适用于与密码学相关的用例。除了加密文件外,它还可以完成许多任务。您可以通过访问 OpenSSL 文档页面 了解所有使用它的方法,其中包括手册链接、OpenSSL Cookbook、常见问题解答等等。要了解更多信息,请尝试使用其各种包含的加密算法,看看它是如何工作的。

接下来阅读什么
User profile image.
经验丰富的软件工程专业人士。主要兴趣是安全、Linux、恶意软件。喜欢在命令行上工作。对底层软件和了解事物如何运作感兴趣。此处表达的观点是我个人的,不代表我雇主的观点

1 条评论

感谢关于安全措施的详细指南!
最近我看到一些增强安全性的可能措施列表 - https://topdevs.org/blog/web-and-mobile-app-security,并且一直想知道它们是否真的那么好。正如所描述的,它们似乎非常有保障。好吧,黑客不会睡觉,因此在应用程序开发过程中包含此类实践非常有用。只是为了确保 ;)

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.