OpenSSL

一:简介

介绍

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-----
原文地址:https://www.cnblogs.com/xuexianqi/p/14157064.html