openssl数据加密

Posted 莫孟林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openssl数据加密相关的知识,希望对你有一定的参考价值。

一、openssl简介

 

openssl是最著名的开源SSL,其用 C 实现,被广泛应用在基于TCP/Socket的网络程序中。

OpenSSL:开源项目

三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss

1、SSL(Secure Sockets Layer,*接层)是一个安全协议,为基于TCP的应用层提供安全链接,如https。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。SSL协议被广泛应用于电子商务、网上银行等领域,为网络上数据的传输提供安全性保障。

SSL协议位于TCP 协议层和应用层之间(即在会话层或表示层),当数据经过它流出的时候被加密,再往TCP/IP 送,而数据从TCP/IP  流入之后先进入它这一层被解密,同时它也能够验证网络链接两端的身份。

通过SSL可以实现:

连接的私密性:在SSL 握手阶段生成密钥后,用对称加密算法对传输数据进行加密。
身份认证:对服务器和客户端进行基于证书的身份认证,其中客户端认证是可选的。
连接的可靠性:消息传输过程中使用基于密钥的MAC(Message Authentication Code,消息验证码)来检验消息的完整性。

2、TLS(Transport Layer Security)

1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
1996年,SSL 3.0版问世,得到大规模应用。
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2(目前使用最多的)的修订版

SSL、TLS功能:机密性,认证,完整性,重放保护(重放的意思是,拒绝相同的包,避免重放攻击)

3、基本的运行过程

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。这时client端已经拿到公钥了,由于非对称加密算法在解密的过程中,耗时巨大,所以通过非对称秘钥来加密传输的数据显然不合逻辑,所以就有了这种方法–通过非对称秘钥来加密对称加密的秘钥(数据量小,不会产生耗时巨大的弊端),以确保双方协商传输的对称秘钥不会被篡改,真正的数据传输,实际用的是对称加密的方法。

但是如果要保证server向client端传输的公钥不被篡改,则需要用证书对公钥进行签名,如果证书是可信的,那么公钥就是可信的。

SSL/TLS协议的基本过程是这样的:

(1) 客户端向服务器端索要并验证公钥。(明文传输,可以被篡改,需要证书来验证公钥的来源是否正确)
(2) 双方协商生成”对话密钥”。
(3) 双方采用”对话密钥”进行加密通信。

4、握手阶段的详细过程( Handshake协议)

技术分享图片

1)、客户端请求建立SSL链接,并向服务端发送一个随机数–Client random和客户端支持的加密方法,比如RSA公钥加密,此时是明文传输。
2)、服务端回复一种客户端支持的加密方法、一个随机数–Server random、授信的服务器证书和非对称加密的公钥。 (如果客户端不支持服务器端的算法,服务器端将关闭连接)
3)、客户端收到服务端的回复后利用服务端的公钥,加上新的随机数–Premaster secret 通过服务端下发的公钥及加密方法进行加密,发送给服务器。
4)、服务端收到客户端的回复,利用已知的加解密方式进行解密,同时利用Client random、Server random和Premaster secret通过一定的算法生成HTTP链接数据传输的对称加密key – session key。(DH  Deffie-Hellman)

经过这4个阶段之后,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,使用的就是普通的HTTP协议,只不过用对称秘钥加密内容。

二、openssl的基本应用

openssl的基本应用有:对称加密、 单向加密、生成用户密码、生成随机数、对称加密

1、openssl的对称加密:

  1. [[email protected] app]# ls
  2. fist_encrypt
  3. [[email protected] app]# openssl enc -e -des3 -a -salt -in fist_encrypt -out fist_encrypt.des3
  4. enter des-ede3-cbc encryption password:
  5. Verifying - enter des-ede3-cbc encryption password:
  6. enc :表示对称加密
  7. -e :表示要执行的动作是加密 相反的 -d表示解密
  8. -des3: 表示钥使用的算法是des3
  9. -a : 表示base64编码(base64:A-Za-z0-9+/,这些组合在一起,总共64个)
  10. -salt : 表示加盐,默认就表示加盐
  11. -in : 表示输入,我们选择的是fist_encrypt这个文件
  12. -out : 表示输出,我们将新生成的文件命名为fist_encrypt.des3
  1. [[email protected] app]# openssl enc -d -des3 -a -salt -in fist.des3 -out new_file #解密的参数与加密的参数要对应好
  2. enter des-ede3-cbc decryption password:

可以通过“man enc”来查看对称加密的各种选项和算法

2、单向加密

  1. [[email protected] app]# openssl dgst -md5 -hex fist.des3
  2. MD5(fist.des3)= bd7c8c96452aff39b63049cd0696b47d
  3. [[email protected] app]# openssl dgst -sha1 fist.des3
  4. SHA1(fist.des3)= 0d1b1a6594ba7ff72e78558eb55fe5c5877bcda2
  5. dgst:表示单项加密
  6. -md5、-sha1 :表示算法
  7. -hex :表示已16进制的格式输出; dgst支持很多种格式输出,可以通过man dgst来查看
  8. 以上的命令相当于
  9. md5sum fist.des3
  10. sha1sum fist.des3

可以通过man dgst来查看openssl所支持的选项和其所支持的算法,直接man openssl是查不到的。

3、生成密码

  1. [[email protected] app]# openssl passwd -1
  2. Password:
  3. Verifying - Password:
  4. $1$oWzC5Ru.$XVxqgrenwYJ.g8xbnnoWz0
  5. passwd:表示生成密码
  6. -1:表示使用md5算法
  7. -salt:表示加盐,也可以自己指定,如: -salt "dddeeeed" (字符串最多8位) 上述操作,我们并没有指定 -salt选项,该选项为系统默认添加。上述“$1$oWzC5Ru.$”表示盐的部分
  8. 我们通常会用这个命令来生成用户的口令加密串,其格式和/etc/shadow 下的第二个字段格式完全一样。

4、生成随机数

  1. [[email protected] app]# openssl rand -base64 20
  2. EDQIGyLyswYmbjCoYmylb3RcPmE=
  3. [[email protected] app]# openssl rand -base64 22
  4. HzFIds+ni82PiTd5Zw6gsJGBVFx/Vw==
  5. [[email protected] app]# openssl rand -hex 22
  6. 7c9f9f457e6641e3c093acff40bc8eac7c56d2c371bf
  7. [[email protected] app]#
  8. rand : 表示生成随机数
  9. 2022:表示生成的位数
  10. -base64:表示以base64的格式输出
  11. -hex: 便送hi以十六进制的格式输出

5、非对称秘钥加密

首先说几个算法:

RSA:支持公钥和数字签名的加密,密钥交换
ELGamal:支持公钥和数字签名的加密
DSA:支持数字签名,和密钥交换
DSS :支持密钥交换
dh:对称密钥交换

下面我们使用openssl生成私钥:

  1. [[email protected] app]# openssl genrsa -out private_key
  2. Generating RSA private key, 2048 bit long modulus
  3. ......................+++
  4. .......+++
  5. e is 65537 (0x10001)
  6. genrsa :表示生成rsa
  7. -out :输出文件名
  8. 生成的默认位数为2048位,可以手工指定
  9. 使用rsa算法生成private_key
  10. 下面我们查看一下生成的key的内容
  11. [[email protected] app]# ls
  12. fist.des3 fist_encrypt new_file private_key
  13. [[email protected] app]# ll
  14. 总用量 16
  15. -rw-r--r--. 1 root root 57 17 21:21 fist.des3
  16. -rw-r--r--. 1 root root 16 16 19:44 fist_encrypt
  17. -rw-r--r--. 1 root root 16 17 21:21 new_file
  18. -rw-r--r--. 1 root root 1679 17 22:40 private_key
  19. [[email protected] app]# cat private_key
  20. -----BEGIN RSA PRIVATE KEY-----
  21. MIIEpgIBAAKCAQEA3u6Q9YvkvAM0NZfZQb7NO3Mb8aw2Y0rNZtTA2tQ1Az90TM2r
  22. cu1QFfLeKphf1YUo2Lxq7SFHT07SCcdhzJolzzWGr+QjI8g5LAcWFYDFKj34lb+D
  23. Ps+LziqGoh8txsLzP1kitzVeuXB7ZMYlwRu0eJoOUeGdg3YXKNksDjgaQwS0+4vE
  24. xvu5xpVKTcpMwyHWAslb/LbNeR/x+M7m5nYZ7yPQ88CK+a2vmP/XOA53ezKOIDPc
  25. roT8jCTNYRJFhKjywyCi4tTFwtFBdoEubBoNH6Km+AiQ7oANf6vYKWQONn6Xid0u
  26. DIE2XUQ6V3bfgfRZAHWfEntToE/A4EuN5PopVQIDAQABAoIBAQCkKYFNkAqL+MAF
  27. hyBRLbPrx0QYnvwd+gNvadPqUMII9j0qIXnTU7XZs9KuAy7vCPOfRoBmxk7AtAYv
  28. dUcrZ4fYIk5gT9sgilyvczhr9Ts7dA8OFs0K/8KvutkRoWwQJZcCWx0ZVI/Adngn
  29. KVK79S7ccHWDDmTzXY6IYgPzJJUSK5FTtdhTsUetKSZZBwlrfq/2WmmqDbuGFU0H
  30. jxz4POT9n41nfuTZ8UmUkLmAWMnOi+3sDk/VC0uLDBMWwX26Sj1ngyBDOAZCCamm
  31. jOY2opEqQWrBMfXPMbZ1OrxaQ37EHRJkNqOlXOG/JB02Zw24i+Ac7qEduqL9Ye/J
  32. x7hQhc4xAoGBAO874TIFvxA4R2K+lintbcFKJyX7kzpHSclyCkWkymp8i5cSiaUr
  33. Yl/rYdNKJSWnId2dTvfZJ9dcw1GCMR/mEAE6stWNqVLySG8Izn00hogzu+ucokJC
  34. 2jFiRbNO9OyGrGOOzpuqpigOblwVCmLnELJeyVgsbDnaiwdgVpsnKXTjAoGBAO6O
  35. NeoPde8jqAAeZjhAfr2iqPVUCt5PDMd4CrC0+5ZaqEsoFRLeiUASpaScUIO3Y9IZ
  36. oN5HxzETgHj9ultuODtMzWnTwdYwzYHyLBQjxnykVtLErnnzLXqko4U40HnkzedV
  37. QDk+ZZ3kiubW7hEdX7uMcKRy3ZgmM3/qIuVqPvZnAoGBALU3+sJVsAGtYAXgsQdZ
  38. n0ZH0ZfoFgKTdcVu6XEP/3Tim

同样的可以通过man genrsa 来查看生成rsa的参数

因为私钥是一个很重要的文件,是绝对不允许泄露的,所以我们可以对访问的私钥加密,并设定权限,看如下操作

  1. [[email protected] app]# (umask 066;openssl genrsa -out private_key.tmp -des3 2048)
  2. Generating RSA private key, 2048 bit long modulus
  3. ......................................................................+++
  4. .........................+++
  5. e is 65537 (0x10001)
  6. Enter pass phrase for private_key.tmp:
  7. Verifying - Enter pass phrase for private_key.tmp:
  8. [[email protected] app]#
  9. ():表示在子shell中执行,不会影响当前环境,umask设定权限为066,创建文件时只有属主有读写权限
  10. -des3 :表示对生成的私钥进行对称加密, 使用了该选项,当调用私钥时需要输入密码才可以访问。
  11. 2048 表示生成的位数
  12. <br >我们查看一下私钥文件</br >
  13. [[email protected] app]# cat private_key.tmp
  14. -----BEGIN RSA PRIVATE KEY-----
  15. Proc-Type: 4,ENCRYPTED
  16. DEK-Info: DES-EDE3-CBC,99D59E1B7B7E32C0
  17. jtPJ1f6naRCo3b0MybmUW0QrIMlh3rsnqX7429S3WaunFVERpIjfnxMERJ9pdqEL
  18. cbhh5w1ReUJfVsv9VBWffqKfQfiwklNIXvkE7W++K7bLT/LE6Q8Is0JKPciv7/NI
  19. sh/fCYEKsTmQxnnQY0U6wOg4jobBiK9iLO4gfhDhiVsWeKh1RlzxamOHYlMNFXog
  20. Eyl5KL4dfmHpVhDAOhSWVa/wr4dEjNANZ7+eMKP13T93fXUR1EMmPR4hneEMkiKs
  21. k0/7UouMgpe/pRpCJ04TD27ljGmN+IC7GEvannOiub6t73yH8qq9hTBr0g/qaAEi
  22. qSk3ecGX3zWQaGdrdI1Hjk+EgUaFr41FWP9fIixRPIgj+SzmTn8JNxWBrYRjPIgH
  23. v+3TqMvgP0sE9SCPxX+RqAq7+CK/+tBodNl1Hoj7DVT0bVfhielJtCh+HbOPQy1x
  24. CE9knOrJvPA+Q617aBRxnMRdO0ppLd1HMC1EJVst6tPfjJa+U7FCH6CcrvaT8IhJ
  25. Fd8Xd7gPYrJi6HHYXB1vWCKCRXHXLaAUqdsFasGL19sUI+T05jR8GimsI3ZRuBSt
  26. z/XkUuLFTAeRiz6bQOapWq7sCqOpSGFgi7QQbPy9gS4j9tAGVQCMYxupzWI7bJQV
  27. L6qoBe+qsHzjTPPihwIKJj1zIsVq5s3dm3ZMZv8D4sESJxKrtVT63bLLPp5juX2Q
  28. 1sqHr6wHqmQkqYSJ/fKZSG81FqV258tcCDvCkoc1EiV7FtRgwSz9gqaIZxx0EYVH
  29. W7kKyeL6iEGni6PB/LjZB5lGy/g1i6dggruk9VQ0sUyXmImvkYcdPMfl9sZg7QrL
  30. U16hUVRpGcH7pgelsyrJVUCAxkB7Q4Z78kVWesA02kzeAI0wdaebCYHYLOBFFxRF
  31. HAzTxYLal8CAXZ1gVihqOgjy1PlOHtB/cu+fDJLEJIiYMzGWd2LsgRd6kJqfwF1w
  32. s4xPJ6Lmzi816uLBvH01tXTqav4E/K8XQdBSMRHXPptwVE5nbu7XRNaCEpsNq6JP
  33. KY0uBfdkJj6ETZl/a/x1/LC0mYOB1I5IEinLy4vl0aGtBkIvzDqdNjt036stjFv5
  34. 0TVuka6WodxlJe57plfEg6gj+csBOPjn4IIs4Nc2qFESNFqQfFjmiPSLIh/gRe8+
  35. Lt7puWyohob//bP00Zq+xhFVMSRptQxAdQFWGRoxwv0ByfA2fWBjNAOA/UsYUj1X
  36. UZJFMfBCVKl6Q+4WL+lXyJmICKxVCgZMRCunk8Ydw9cQq4w5WJKZ/BnC9KAdPUWH
  37. DaLtjcIQUV3pEt2ippBj3YS17OFG5r/2NywAkT3YV6/WUo6bx/+vMl79Ld+1wPwS
  38. tZqtbLUSiGDnvN8kxU/XQWUdQXPdS0hwNZzSCwQZb+Llqp8iLc76xmQhE1aJ7Y0d
  39. w4pNSOKxQez48vZfQ8G/R+neu5gJydo5dMpLnuIbv4wfm2mzPO22wgESSsSJMj9C
  40. ZggZlHiOj3FXkp+pTThWu3aPi8gIPkjChoE5lGMz8xssaXg8ctBV4c4T1t5ZfzHZ
  41. xsQZV7TbIWOaglO/+fOof1xevkm7zXWWHfyYs6SZ/sI5lWf1N1MMqNdPr20Mr7p8
  42. -----END RSA PRIVATE KEY-----
  43. DEK-Info: DES-EDE3-CBC,99D59E1B7B7E32C0 这里显示私钥加过密,使用的是des3算法

从一个加过密的私钥中导出私钥

  1. [[email protected] app]# openssl rsa -in private_key.tmp -out ok.tmp
  2. Enter pass phrase for private_key.tmp:
  3. writing RSA key
  4. [[email protected] app]#
  5. 我们查看一下新生成文件
  6. [[email protected] app]# cat ok.tmp
  7. -----BEGIN RSA PRIVATE KEY-----
  8. MIIEpQIBAAKCAQEA6QT8W214GlEmNwBnre9rnN5xVzjCnnBNO5rBxEiQUdzB5Gub
  9. Wuav2KYq5jC/5SBDSV0iRBHVOH+TTc7n4X3b470SER1kzki+3yPw00803xGeTWn7
  10. OeblPoejq4lzz+m4azFvVmbeWuyeoClh7S+qNcK1TNdd1u4GJr2BAcLEJbJzQoXo
  11. Fo+DdF7YE6vHnA/uSkkJFXsllslz8v6CVec88OFika78eNmqVW+DAUd2K5XQExaT
  12. jw+QpMzqgTZB+alXixmsUnEPjwEFKizKAsN3zpoeN+80mHONvHK/j5wMO/1U/WE+
  13. kWFMjBuoamD79vwZ1v0IKulMVg6ulyULZbA0JwIDAQABAoIBAChSyYzUw7ziIBfS
  14. hR6PWPL7d2edlegvDN5sqG1cFUVlS1RI3sh7NSDrmG7fLsXqsFoouL5Iy7oMMaR8
  15. Upot2nhthovZp1EfO5CHuqwGf+K+PMOuvF/HuhH5DPSpQ5ZOHrDGDDtKb94SJl0W
  16. 7DBMWEsXV6JlfoKsC/p2PrXcS28uPsFCNvmLcwxWfx/UpGLS07b0Wq3MB6plnPIh
  17. Ot+miuZyDwmaMar4jZUMQ9gSEznTExejeXI3c0tnLo5dvf/jO2gLMrYMo4p41SJt
  18. 6sCn0R/j4ZZmc0G5u6m3+Gas0G0JKCADmh++Yyoo6s9l/aRdKc/wF7KrQbnMfxI+
  19. p1rF4jECgYEA+VIL3+dbOiLq8ymXegUpSfKrOaII4//bWlZ+iLSoY+/8l6FTTfm0
  20. HfGnQcHSzLymGz5yyHk7IQjFlnQxXDA8e253rqz9wETeo2cX3xa0hZcjOS7w9p8t
  21. mPDkKLnZZd8p3kwli9DVZoUFnpd5wLsg6FdaXIh3tAuExNkxQ8K8cO8CgYEA70Mj
  22. uvH0R1YofXSAg1M+taNY4Xu8tsddiPg1u4jKIgzEnYedRcbmsVnJLsxV3ZoLP0y3
  23. F13Fry2i1Zt4avP+HDZ83SK49OHiSJZXRy/9esoqfzmGLylxt2i331jtT3uOqFlX
  24. GUVPIlpVVWngMA1cPTBoDoJvsJna6GS6QBlMAEkCgYEAh4zK9fXEDIyVbpTLTUTn
  25. GNQ9sXzeFo+xg6EI9Gw8LPF6RDoqn3dGLQ2IIOEvKa7bJG7EWyhGNISfYFhVychT
  26. 6cu6eBaHc3Q+E1rmiJzAku0D8oAJ9BvA36kAcv/wKUm2aqy9sRFeJHnn/zxdrqJO
  27. luN/NlXfttyYV6m59hw29bMCgYEAluX8QepZSyh+rujsKGc3FK2p38P/eDNyvXD1
  28. yonyGdl9o3Clcx2H33CmHrrGqNV/pHOIwdblV59rpFbCconhyP9gbsN4bRGNeoQ/
  29. FWmh73BTrxujklkMHEWSOe3G9asShQCbmxeIWj0oto7o0sWKWBkQd54yPOo8Evd8
  30. M/MAaOkCgYEA2e6hfcZqc6TPummLniUK5meT0xZbcth+Cf04XLyWP03wLl2MecKH
  31. HiiOyo+XJxH3fEAh0Wv4PPSOAdKMCU/beT5fOHsSInoP3gpFIofvl4p21YiRCPk1
  32. ARfAM6FKZ9/8WnNpdJhipt+0huS+p82tUMjX4cdOJdTm5w7iOO3npck=
  33. -----END RSA PRIVATE KEY-----
  34. 已经成功导出

 

从私钥中提取出公钥

    1. [[email protected] app]# openssl rsa -in private_key -pubout -out pub_key
    2. writing RSA key
    3. [[email protected] app]# ls
    4. fist.des3 fist_encrypt new_file private_key private_key.tmp pub_key
    5. [[email protected] app]# cat pub_key
    6. -----BEGIN PUBLIC KEY-----
    7. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3u6Q9YvkvAM0NZfZQb7N
    8. O3Mb8aw2Y0rNZtTA2tQ1Az90TM2rcu1QFfLeKphf1YUo2Lxq7SFHT07SCcdhzJol
    9. zzWGr+QjI8g5LAcWFYDFKj34lb+DPs+LziqGoh8txsLzP1kitzVeuXB7ZMYlwRu0
    10. eJoOUeGdg3YXKNksDjgaQwS0+4vExvu5xpVKTcpMwyHWAslb/LbNeR/x+M7m5nYZ
    11. 7yPQ88CK+a2vmP/XOA53ezKOIDPcroT8jCTNYRJFhKjywyCi4tTFwtFBdoEubBoN
    12. H6Km+AiQ7oANf6vYKWQONn6Xid0uDIE2XUQ6V3bfgfRZAHWfEntToE/A4EuN5Pop
    13. VQIDAQAB
    14. -----END PUBLIC KEY-----
    15. [[email protected] app]#
    16. 注意:生成私钥使用的是 genrsa,而提取操作使用的是rsa
    17. -pubout :表示导出公钥 (必须加该选项,否则导出的是一个原本的私钥而不是公钥)
    18. in: 指定私钥
    19. out:输出公钥的文件名


















以上是关于openssl数据加密的主要内容,如果未能解决你的问题,请参考以下文章

Openssl及加密解密数据加密解密及CA原理

PHP 使用 openssl 解密数据(使用 mcrypt 加密)

加密算法与openssl的使用

安全与加密之加密算法,CA,openssl,证书管理

加密解密数据安全1 OpenSSL 安装

安全与加密(openssl)