zoukankan      html  css  js  c++  java
  • OpenSSL的基本使用

    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]

    三:对称加密

     

    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为什么会出现?一文帮你搞清楚什么是HTTPS
    不要再纠结Python哪个版本好,2020年用Python3就对了
    从学习python到用wxpython编写接口和客户端
    使用.net core中的类DispatchProxy实现AOP
    .net core控制台程序中使用原生依赖注入
    Sql Server数据库常用Transact-SQL脚本
    asp.net core中使用cookie身份验证
    使用Newtonsoft序列化
  • 原文地址:https://www.cnblogs.com/ltyc/p/14056799.html
Copyright © 2011-2022 走看看