一:简介
介绍
OpenSSL是一个开放源代码的软件库包
应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份
OpenSSL 是一个开源项目,其组成主要包括一下三个组件
- openssl:多用途的命令行工具
- libcrypto:加密算法库
- libssl:加密模块应用库,实现了ssl及tls
openssl可以实现的功能
- 秘钥证书管理
- 对称加密
- 非对称加密
官网
https://www.openssl.org/
背景
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输
Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准
其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持
已经成为Internet上保密通讯的工业标准
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证
SSL协议要求建立在可靠的传输层协议(TCP)之上
SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上
SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作
在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性
二:生成密码
引言
在Linux系统中我们要向手动生成一个密码可以采用 opensll passwd
来生成一个密码作为用户账号的密码
Linux系统中的密码存放在/etc/shadow
文件中,并且是 以加密的方式存放的
根据加密方式的不同,所产生的加密后的密码的位数也不同
标准命令
生成密码需要使用的标准命令为 passwd,用来计算密码hash的
目的是:防止密码
以明文
的形式出现
语法格式
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
简化:openssl passwd [option] passwd
常用选项
选项 | 释义 |
---|---|
-1 | 使用 |
-salt | 加入随机数(最多8位) |
-in file | 对输入的文件内容进行加密 |
-stdion | 对标准输入的内容进行加密 |
-salt 详解
指定salt值,不使用随机产生的salt
在使用加密算法进行加密时,即使密码一样,salt不一样,所计算 出来的hash值也不一样
除非密码一样,salt值也一样, 计算出来的hash值才一样
salt为8字节
的字符串
实例
# 用openssl生成一个随机密码
[root@localhost ~]# openssl passwd -1 -salt 'Hello World' # 这里的'Hello World'不是密码,而是salt(盐)
Password: # 这个才是真实的密码
$1$Hello Wo$r0sA58H9bZ8C3Z5VZRiRo1 # 这个就是随机生成的密文的密码
# 用vim打开/etc/shadow
[root@localhost ~]# vim /etc/shadow
# 按i进入:插入模式
i
# 在最后一行输入数据
nancy:$1$Hello Wo$r0sA58H9bZ8C3Z5VZRiRo1:18303::::::
三:对称加密
1.标准命令
对称加密需要使用的标准命令为 enc
2.语法格式
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
3.常用选项
选项 | 释义 |
---|---|
-in filename | 指定要加密的文件存放路径 |
-out filename | 指定加密后的文件存放路径 |
-salt | 自动插入一个随机数作为文件内容加密,默认选项 |
-e | 可以指明一种加密算法,若不指的话将使用默认加密算法 |
-d | 解密,解密时也可以指定算法 若不指定则使用默认算法,但一定要与加密时的算法一致 |
-a/-base64 | 使用-base64位编码格式 |
4.实例
# 在当前文件夹下创建一个文件:1.txt 并添加内容
vim 1.txt
# 按i进入插入模式,添加内容
i
# 添加的内容
I'm 1.txt.
I'm nothing!
# 按Esc退出插入模式,:wq!强制保存并退出
Esc
:wq!
# (加密)将当前文件夹下的1.txt加密 生成 sec_1.txt
[root@localhost ~]# openssl enc -e -des3 -a -salt -in 1.txt -out sec_1.txt
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
# 查看加密后的文件中的内容
[root@localhost ~]# cat sec_1.txt
U2FsdGVkX1+9A+DuvMme1OFHHwDhOUxDHR4gflyv5XDcjmEnDCnNIVcobMe6Bpcj
# (解密)将加密后的 sec_1.txt 解密成 dec_1.txt
[root@localhost ~]# openssl enc -d -des3 -a -salt -in sec_1.txt -out dec_1.txt
enter des-ede3-cbc decryption password:
# 查看解密后的文件:dec_1.txt 中的内容
[root@localhost ~]# cat dec_1.txt
I'm 1.txt.
I'm nothing!
四:单向加密
1.标准命令
单向加密需要使用的标准命令为 dgst
2.语法格式
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key] [file...]
3.常用选项
选项 | 释义 |
---|---|
指定一种加密算法 | |
-out filename | 指定加密后的文件存放路径 |
4.实例
# 用openssl的md5单向加密1.txt
[root@localhost ~]# openssl dgst -md5 1.txt
MD5(1.txt)= eff1a61fc919633c8d51457f7fe1d9ce
# 直接加密一段文本内容(用管道命令)
[root@localhost ~]# echo "我是即将被加密的内容" | openssl dgst -md5
(stdin)= ea0d34386968873c3263c6f7f57813bc
5.其他单向加密
单向加密除了openssl dgst
工具还有:
- md5sum
- sha1sum
- sha224sum
- sha256sum
- sha384sum
- sha512sum
实例
# 用 sha512sum 加密 1.txt
[root@localhost ~]# sha512sum 1.txt
23b9babe6bcbc6d04c2258597003dc414fec5b84c5511927ddf51ea7acbe1fa60239759669c962af99f5da94f2f7fa420e49f74874babba08e1e4680fa0acaf4 1.txt
# 用 sha384sum 加密 1.txt
[root@localhost ~]# sha384sum 1.txt
a9320c60649b617e7f2e920cfdb2e9eb905d446cd2e46bc144446a68accce3a0b6764564f10403da0e372fda44d4c2dd 1.txt
# 用 sha256sum 加密 1.txt
[root@localhost ~]# sha256sum 1.txt
9ba3ecd8d647084403566bfee4f4947d1c2d7f1c37c7631530ad58493f989d80 1.txt
# 用 sha1sum 加密 1.txt
[root@localhost ~]# sha1sum 1.txt
3d9fc45440e99806a47cd2adbd7579ebcef7a075 1.txt
# 用 md5sum 加密 1.txt
[root@localhost ~]# md5sum 1.txt
eff1a61fc919633c8d51457f7fe1d9ce 1.txt
五:生成随机数
1.标准命令
生成随机数需要用到的标准命令为 rand
2.语法格式
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
3.常用选项
选项 | 释义 |
---|---|
-out file | 将生成的随机数保存至指定文件中 |
-base64 | 使用base64 编码格式 |
-hex | 使用16进制编码格式 |
num | 变成随机数的内容(只能是数字 ) |
4.实例
# 使用16进制编码格式将数字:7 生成随机数(每次生成都不一样)
[root@localhost ~]# openssl rand -hex 7
53f22dab1b83af
[root@localhost ~]# openssl rand -hex 7
767c447ae16af5
[root@localhost ~]# openssl rand -hex 7
493a3e640e3f83
# 使用16进制编码格式将数字:7 生成随机数(每次生成都不一样)
[root@localhost ~]# openssl rand -base64 7
O190Q7A7cQ==
[root@localhost ~]# openssl rand -base64 7
Mh7keeAqOA==
# 使用16进制编码格式将数字:7,将生成的随机数保存到:7.txt
[root@localhost ~]# openssl rand -base64 7 -out 7.txt
六:生成秘钥对
1.标准命令
首先需要先使用 genrsa 标准命令生成私钥,然后再使用 rsa 标准命令从私钥中提取公钥
2.语法格式
genrsa
的语法格式
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
ras
的语法格式
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
3.常用选项
genrsa
的常用选项
选项 | 释义 |
---|---|
-out filename | 将生成的私钥保存至指定的文件中 |
不同的加密算法 | |
numbits | 指定生成私钥的大小,默认是:2048 |
ras
的常用选项
选项 | 释义 |
---|---|
-in filename | 指明私钥文件 |
-out filename | 指明将提取出的公钥保存至指定文件中 |
-pubout | 根据私钥提取出公钥 |
4.实例
一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask
命令设置生成的私钥权限
# 用 umask 命令设置生成的私钥权限
[root@localhost ~]# (umask 777; openssl genrsa -out 2.txt 4096)
Generating RSA private key, 4096 bit long modulus
........................................++
......................................................................................................................++
e is 65537 (0x10001)
# 将提取出的公钥保存至文件:2.pub 中
[root@localhost ~]# openssl rsa -in 2.txt -out 2.pub -pubout
writing RSA key
# 查看文件:2.pub
[root@localhost ~]# cat 2.pub
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvkEuGrlGMQwYJbCW9kJO
rRS0TcnU2jc+IFDjfV0XyCS3abeyRpY90RNgXcEX1WWqSvi5bta/lRotboA7l042
Sm64RrGziNcE4XBFoO+kwIduTymYLQYq6WyyNsU6Zo0ds7cMC7mzCCpwBcmVF842
idMEOvcpXSQkYt4vIUcqyjz2KDTZk+DWb1fqKSMx9mfmETs5aR0RlfVoMir67PNS
UXHN6kr4A2xoHK1eDJzGQXXd/lC9EfMXkDRSdyrthQ3X/gI8eP6xY+EjQPzugJfy
2/URtWVZzvLgBak/Vdh4HaSsFskXvW7NhPyA3uH6q7uJ8Otv0/m5tK1DfVlHsT5v
L3/UwFKlHmnDYPs3K6TCSZ1ARYY8Ig7TJJEQl3NCt9e4YZoUpygPDVBdDv38YjJ7
viHdp+mq+o4k8vDNzwDFQGTFl+s4O0i/FF9db9G404/nEQz82k6eAJntEP9G4Nxz
YXJeC7boZgZMw5cMwfp7O2Sg+uhnFN/AvaymmMvdKiyKYfM06WZ3zp7OQQTplgBu
R7STlOR+K4MTIf22qS01PCdXo2Cjv98aBGCNFrfGkcMFUxy/kl00TZgcBRJ50rgy
+2+SBNDsB/y/wfX6/oehGbhIuy+B6xVBlReugqKCcCzzeixSYNv149UvN4h7NQ7T
mr6pCNQ+sJBIXA1ZSzymxuECAwEAAQ==
-----END PUBLIC KEY-----