openssl的运用

一、概述

     Opssl是一个用于TLS/SSL协议的工具包,也是一个通用密码库。

    包含了国密sm2 sm3 sm4,包含了对称加密,非对称加密,单项散列,伪随机、签名,密码交换,证书等一些算法库。

为了深层次的学习Openssl,我们经常常从它的源代码入手

 主要的源代码有:

apps目录下的各个程序,对应于openssl的各项命令;

demos下的各种源代码;

engines下的各种engine实现;

test目录下的各种源代码。

     

SSL/TLS 握手过程

1.客户端向服务器发出问候语,其中包含支持的协议版本、加密套件和随机数。

2.服务器进行回应问候语,包含着选择的协议版本、加密套件和随机数。

3.服务器向客户端发送其证书,包含着服务器的公钥和身份信息。客户端验证证书并向服务器发送其证书。

4.客户端和服务器使用 Diffie-Hellman 密钥交换协议协商一个会话密钥

5.客户端和服务器交换更改密码规范消息,其中包含用于加密和解密后续通信的密钥

6.客户端和服务器交换完消息,握手成功。

握手类型:

1.全握手:客户端和服务器交换所有必需的信息

2.半握手:如果客户端和服务器之前建立了会话,则可以使用恢复握手来重新建立会话。恢复握手比全握手更快,因为它只需要交换较少的信息

    在Linux和Windows上都可以下载,而在Linux一般自带,但是一般里面含有漏洞,

可以升级一下

比如这个

在kali中进行下载时,先更新源和升级源,换成国内的源

apt-get updateapt-get upgrade

安装基础编译环境

 apt-get install build-essential

编译安装zlib库

   wget http://zlib.net/zlib-1.2.5.tar.gz    //可以去http://www.zlib.net/ 查看并下载最新的zlib库tar -zxf zlib-1.2.5.tar.gzcd zlib-1.2.5/./configure --prefix=/usr/localmake && make install

然后卸载旧版本的Openssl

apt-get purge opensslrm -rf /etc/ssl #删除配置文件

编译安装Openssl

wget ftp://ftp.openssl.org/source/openss-1.0.0c.tar.gztar -zxv openssl-3.2.2c.tar.gzcd openssl-1.0.0c/./config --prefix=/usr/local --openssldir=/usr/local/sslmake && make install./config shared --prefix=/usr/local --openssldir=/usr/local/sslmake cleanmake  && make install

最终:安装好了!!!

openssl 命令行在/usr/local/bin

配置安装在 /usr/local/ssl

头文件在 /usr/local/include/openssl

so库文件  在/usr/local/lib

但是在kali2024版本里面自带Openssl,以上的过程是针对2023版本的。

DES算法(分组密码)

输入输出长度相同

密钥,输入64比特,每隔7个比特设置一个错误检查,也是就校验,所以为56比特。

    如果不是8字节(64比特),需要补0

有16轮循环,每一轮使用不同的子密钥,每两轮讲左右侧对调

   二、Openssl命令行使用

一般的语法规则:

      

openssl [命令】 【选项】【参数】

加密和解密操作:

可以使用enc和dec命令来实现

openssl enc -aes-256-cbc -in input.txt -out output.enc-aes-256-cbc :指定加密算法和模式
-in input.txt :指定要加密的输入文件
-out output.enc :指定加密后的输出文件

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项有:-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密

明文:

加密及密文:

解密:

openssl dec -aes-256-cbc -in output.txt -out output.enc 

生成随机数:

主要运用rand命令

openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
-out file:存入其他文件
-base64:使用base64 编码格式
-hex:使用16进制编码格式

生成密钥对

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项:
-out filename:将生成的私钥保存至指定的文件中-des|-des3|-idea:不同的加密算法numbits:指定生成私钥的大小,默认是2048

证书管理工作

  其中包括生成证书签名(CSR)、创建自签名证书、验证证书以及吊销证书。

生成(CSR):

openssl req -new -key private.key -out csr.pem

req代表要使用CSR生成证书

创建自签名证书:

openssl x509 -req -in csr.pem -signkey private.key -out certificate.pem

验证证书:

打开x509

openssl x509 -noout -text  -in ca.pem

查看里面的内容

然后验证公钥私钥是否匹配

diff -eq <(openssl x509 -pubkey -noout -in cert.crt) <(openssl rsa -pubout -in cert.key)

如果匹配的话,

writing RSA key

验证证书CA

openssl verify -CAfile ca.pem client.pem


 

三、openssl BIO接口

Openssl的抽象IO(即BIO),是Openssl对于IO类型的抽象封装,包括了:内存、文件、日志、标准输入输出、socket(TCP/UDP)、加密、解密、摘要和SSL通道。

Openssl BIO 通过回调函数为用户隐藏了底层实现细节,所有类型的 bio 的调用大体上是类似的。
Bio 中的数据能从一个 BIO 传送到另外一个 BIO 或者是应用程序

   BIO包含了多种接口,用于控制在BIO_METHOD中的不同实现函数,包括了六种filter型和8

种source/sink型。

数据源:source/sink 类型,比如:sokect BIO和文件BIO

BIO的数据结构主要有两个,在crypto/bio.h的定义如下:

1、BIO_METHOD

   ~  type  :具体BIO类型;

   ~ name :名字;

   ~ bwrite : 具体BIO操作回调函数;

  ~ bread : 具体BIO操作回调函数;

  ~ bputs : 写入字符串回调函数;

  ~ bgets : 读字符串函数

   ~ ctrl : 控制回调函数

   ~ create :生成具体BIO回调函数;

   ~ destroy :销毁

  ~ callback_ctrl :具体BIO控制回调函数,该函数可由调用者(而不是实现者)来实现,然后通过BIO_set_callback等函数来设置。

BIO allocation and freeing functions

# include <openssl/bio.h>BIO *  BIO_new(BIO_METHOD *type);   //BIO_new()函数使用方法type返回一个新的BIO,调用失败,返回新创建的BIO或NULLint    BIO_set(BIO *a,BIO_METHOD *type);    //设置现有BIO的方法,成功则返回1,失败则返回0
int    BIO_free(BIO *a);    //释放单个BIO,并返回值 ,成功则返回1,失败则返回0void   BIO_vfree(BIO *a);   //释放单个BIO,但不返回值
void   BIO_free_all(BIO *a);   //释放整个BIO链,发生错误的时候不会停止,也没有返回值

BIO I/O functions

 #include <openssl/bio.h>int    BIO_read(BIO *b, void *buf, int len);
//尝试从BIO b中读取len个字节,并将数据放入buf中int    BIO_gets(BIO *b, char *buf, int size);
// 执行获取操作,也将数据放置在bufint    BIO_write(BIO *b, const void *buf, int len);
// 将len个字节从buf写入BIO b中int    BIO_puts(BIO *b, const char *buf);
//将以null终止的字符串buf写入BIO b中如果返回的值为正则读取和写入成功,者如果结果为0或-1,则没有成功读取或写入数据。如果返回值为-2,则不会以特定的BIO类型实现该操作。

formatted output to a BIO

 #include <openssl/bio.h>int BIO_printf(BIO *bio, const char *format, ...)  //输出发送到指定的BIO bioint BIO_vprintf(BIO *bio, const char *format, va_list args)  
//输出被发送到指定的BIO bio支持所有通用格式说明符。参数列表args是stdarg参数列表。int BIO_snprintf(char *buf, size_t n, const char *format, ...)
//用于没有通用snprintf()函数的平台。但是size参数n指定输出缓冲区的大小int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)返回写入的字节数,出错为-1

2.生物

truct bio_st {BIO_METHOD *method;/* bio, mode, argp, argi, argl, ret */long (*callback)(struct bio_st *,int,const char *,int, long,long);char *cb_arg;   /* first argument for the callback */int  init;int  shutdown;int  flags;      /* extra storage */int  retry_reason;int  num;void *ptr;structbio_st *next_bio;   /*usedbyfilterBIOs*/struct bio_st *prev_bio; /* used by filter BIOs */int references;nsigned long  num_read;unsigned long num_write;CRYPTO_EX_DATA ex_data;
};/*
主要项含义:init:   具体句柄初始化标记,初始化后为1。比如:文件 BIO 中,通过 BIO_set_fp 关联一个文件指针时,该标记则置 1 ;socket BIO中,通过 BIO_set_fd 关联一个链接时,设置该标记为 1。shutdown: BIO 关闭标记,当该值不为 0 时,释放资源; 该值可以通过控制函 数来设置。flags:  有些 BIO 实现需要它来控制各个函数的行为。比如文件 BIO 默认该值为 BIO_FLAGS_UPLINK,这时文件读操作调用UP_fread 函数而不是调用fread 函数。retry_reason: 重试原因,主要用在 socket 和 ssl BIO 的异步阻塞。比如 socket bio 中,遇到 WSAEWOULDBLOCK 错误时,openssl 告诉用户的操作需要重试。num:  该值因具体 BIO 而异,比如 socket BIO 中 num 用来存放链接字。ptr:  指针,体 bio 有不同含义。比如:文件 BIO 中它用来存放文件句柄;mem BIO 中它用来存放内存地址;connect BIO 中它用来存放 BIO_CONNECT 数据,accept BIO 中它用来存放 BIO_ACCEPT 数据。next_bio: 下一个 BIO 地址,BIO 数据可以从一个BIO传送到另一个BIO,该值指明了下一个 BIO 的地址。references: 被引用数量。
num_read:   BIO 中已读取的字节数。
num_write:  BIO 中已写入的字节数。
ex_data:    用于存放额外数据。
*/typedef struct bio_st BIO;struct bio_st
{BIO_METHOD *method; //BIO方法结构,是决定BIO类型和行为的重要参数,各种BIO的不同之处主要也正在于此项。long (*callback)(struct bio_st *,int,const char *,int, long,long); //BIO回调函数char *cb_arg;                                                      //回调函数的第一个参量int init;         //初始化标志,初始化了为1,否则为0。比如文件BIO 中,通过BIO_set_fp//关联一个文件指针时,该标记则置1。int shutdown;     //BIO开关标志,如果为BIO_CLOSE,则释放BIO时自动释放持有的资源,否则不自动释放持有资源int flags;        //有些BIO 实现需要它来控制各个函数的行为。比如文件BIO 默认该值为BIO_FLAGS_UPLINK,//这时文件读操作调用UP_fread 函数而不是调用fread 函数。int retry_reason; //重试原因,主要用在socket 和ssl BIO 的异步阻塞。比如socketbio 中,遇到//WSAEWOULDBLOCK 错误时,openssl 告诉用户的操作需要重试int num;          //该值因具体BIO 而异,比如socket BIO 中num 用来存放链接字。void *ptr;        //ptr:指针,具体bio 有不同含义。比如文件BIO中它用来存放文件句柄;mem bio 中它用来存放//内存地址;connect bio 中它用来存放BIO_CONNECT 数据,acceptbio 中它//用来存放BIO_ACCEPT数据。struct bio_st *next_bio; //BIO链中下一个BIO 地址,BIO 数据可以从一个BIO 传送到另一个BIO。struct bio_st *prev_bio; //BIO链中上一个BIO 地址,int references;          //引用计数unsigned long num_read;  //已读出的数据长度unsigned long num_write; //已写入的数据长度CRYPTO_EX_DATA ex_data;  //额外数据
};

举一个例子,

   Memory BIO对内存的操作,包括了读写操作。使用Openssl需要创建一个SSL_CTX对象,跟踪共享信息的上下文,例如使用的证书、私钥。

#include <stdio.h>
#include <OpenSSL/bio.h>int main() 
{BIO *b=NULL;int len=0;char *out=NULL;b=BIO_new(BIO_s_mem()); 			//生成一个mem类型的BIO,用于对内存进行I/O操作len=BIO_write(b,"OpenSSL",7);		//将字符串"OpenSSL"写入bio,长度为7len=BIO_printf(b,"%s","zcp");		//将字符串"zcp"写入biolen=BIO_ctrl_pending(b);			//得到缓冲区中待读取大小out=(char *)OPENSSL_malloc(len);    //根据数据的大小来分配数据len=BIO_read(b,out,len);			//将bio中的内容写入out缓冲区OPENSSL_free(out);BIO_free(b);return 0;
}

四、密码学的基本术语

加密

     是一个用于将称为纯文本的简单可读数据转换为称为密文的不可读数据的过程,只有在用户知道加密密钥的情况下才能转换为纯文本。在密码学里面包含着两种加密方式:对称加密和非对称加密。

编码

      以不同类型的系统可以轻松使用的格式转换数据的过程。用于编码数据的算法是公开可用的,如果该人知道该算法,对其进行解码,不需要任何密钥来解码信息,它很容易逆转,用于确保数据的完整性和可用性。编码算法示例:ASCII、UNICODE、URL 编码、Base64。

应用场景:

     覆盖网络通信协议:SSL/TLS ,路由器的IPsec,手机的3GPP(3G、4G、5G)

    行业大数据业务与平台:区块链

     数字货币与电子支付:法定货币

签名

     为了防止伪造、篡改和否认,但是要正确运用数字签名技术还有一个非常大的前提,那就是用来验证签名的公钥必须真正的属于发送者。

如何使公钥真正发送给发送者,那么就需要证书了。

证书

       证书是由认证机构(CA)颁发的数字文件,用于证明某个实体(通常是个人或组织)的身份和公钥的有效性。证书包含了主体的身份信息、公钥以及CA的数字签名。可以用于公钥验证、防止中间人攻击、加密通信。

   (图解如上:)

证书的格式:

  证书的生命周期

   从证书申请到被吊销的整体过程

1.证书申请,必须生成一对密钥对,我们常用RSA密钥、DSA密钥。

2.证书颁发,一般有CA的工作人员对用户信息进行审查。

3.证书验证,验证的信息包括CA的数字证书、证书的有效期、证书是否被吊销等信息,我们一般使用verify程序完成验证,没有详细的资料或能力验证时,可以到CA或者CA指定的机构验证证书。

4.证书吊销,两种方法:从CA证书数据库中删除被吊销的证书;对外公布被撤销的证书信息。

5.证书吊销,证书的使用有一定的年限,过期后要进行更新。

CA  :

   负责创建和分配证书,受用户信任的权威机构。

     

CSR(证书签名请求文件)

    用户向CA请求数字证书时,用户需要再自己的电脑中先产生一个公私钥对,用户需要保管好自己的私钥,然后再把公钥和你的个人信息发送给CA机构,CA机构通过你的公钥和个人信息最终签发出数字证书。目前很多人常用的一般是在线产生的CSR。

CSR在线生成工具:


https://www.chinassl.net/ssltools/generator-csr.html

什么样的SSL证书才是安全的证书

  由可信的CA机构签发(可以冒充);访问的地址跟证书认证地址相符合;证书在有效时间内。

如何冒充可信的CA机构?

利用Mkcert工具,

https://github.com/FiloSottile/mkcert

五、RSA的签名:

生成签名需要公钥和私钥:先生成私钥再从私钥中提取出来公钥

创造一个消息:

接下来就用私钥对消息生成一个sha256的签名

cat 命令来查看的时候出现了乱码的现象,因为这个签名是一个二进制

看一下二进制的形式

证明成功了!!!

给大家推荐一个密码学习的平台:

CryptoHack

先创建一个新目录

六、将http升级为https的步骤

   在kali里面,将http升级为https有很多方法。现在演示一种利用Openssl的方法

SSL证书签发流程:

    由于客户端是发起通信的一方,双方没有协商好的加密算法,服务端也不可能持有客户端的公钥信息,所以证书不能被加密发送,那么要解决这个问题就必须引入第三方可信机构(CA),客户端信任它,它就可以对服务器证书做出认证,具体来说就是使用自己的私钥对服务器证书进行签名,签名后的信息包含在证书内,这样客户端只需要持有各个 CA 的公钥,便可以对签名信息进行解密来验证证书的有效性。

 NGINX和Openss

   首先先下载NGINX,kali如果不换源的话,需要找到符合配置的NGINX,所以我换成了清华大学的源。

https和http

访问浏览器的问题。

利用NGINX创建一个网站。

先创建一个目录来进行存放网站的目录。

然后在nano里面写一个简单的前端。

编辑 Nginx 的配置文件,为新网站设置一个服务器块

sudo nano /etc/nginx/sites-available/mywebsite
server {listen 80;server_name mywebsite;location / {root /var/www/mywebsite;index index.html index.htm;}
}

sites-enabled 目录中创建一个软链接,以启用配置。

    

重启 Nginx 之前,测试配置文件是否有错误,如果没有问题的话,就会出现以下:

之后再进行重启操作就可以了。

sudo systemctl restart nginx

可以查看一下端口是否开放

查看防火墙是否关闭和selinux是否禁用,如果没有那就添加一些规则。

创建一个新的目录:

先生成一个私钥

从私钥里面提取出来公钥

然后申请证书

然后就可以生成一个自签证书。

填写一些内容:

  1. 国家
  2. 省份或州;
  3. 公司的名字;
  4. 组织部的名字;
  5. 服务器的完全限定域名(FQDN),或者是证书所有者的名字;
  6. 邮箱账号;

查看一下证书

openssl x509 -text -in server.crt

查看证书的时间

openssl x509 -in server.crt -noout -dates

配置到NGINX里面

    记得打开网站之前打开NGINX哦!

sudo systemctl status nginx
#查看NGINX的状态

sudo systemctl start nginx#开启NGINX

或者直接设置为开机自启

sudo systemctl enable nginx

    到现在为止,我们就把http升级为https,将它的保密性提高,但是没有经过网站的验证是我们自己生成的。注意:自己生成的SSL证书仍然有安全风险。

利用Apache和Openssl

创建一个目录

cd && mkdir -p /home/kali/Desktop/myCA/signedcerts && mkdir /home/kali/Desktop/myCA/private && cd /home/kali/Desktop/myCA#创建桌面下的myCA目录存放CA相关信息#myCA/signedcerts :存放CA认证的证书副本
#myCA/private  :存放私钥
echo '01' > serial && touch Cert.txt
#创建证书库,两个文件存放CA每一次颁发证书的记录

新建一个 caconfig.cnf 文件来配置 CA 信息,


[ local_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = supplied
#      
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
basicConstraints        = CA:false
#      
#
# The default root certificate generation policy.
# 生成 CA 根证书设置
[ req ]
default_bits    = 2048                                          # 默认生成证书请求时的秘钥长度
default_keyfile = /home/kali/Desktop/myCA/private/cakey.pem # 默认私钥存放位置
default_md      = sha256                                        # 默认证书签名时使用的摘要算法
#     
prompt                  = no
distinguished_name      = root_ca_distinguished_name
x509_extensions         = root_ca_extensions
#
#
# Root Certificate Authority distinguished name.  Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName              = myCA              # CA 机构名
stateOrProvinceName     = JS                # 所在省份
countryName             = CN                # 所在国家(仅限两字符)
emailAddress            = 123456@qq.com    # 邮箱
organizationName        = YUNXI            # 组织名
organizationalUnitName  = YNPC             # 单位名
#      
[ root_ca_extensions ]
basicConstraints        = CA:true

生成自签名的 CA 根证书和秘钥

然后再服务器上生成证书

最后就可以了。

七、Openssl源代码的学习

     对于openssl函数的学习,主要查看openssl自身是如何调用的,或者查看函数的实现。对于openssl中只有实现而没有调用的函数。

   之前演示的内容,基本上是利用命令行进行操作的,接下来就来看看openssl的具体代码吧!

  以RSA的加密/解密来演示,其他的生成的密钥/签名之类,其实也差不多。

      加密函数RSA_public_encrypt

int RSA_public_encrypt(int flen,const unsigned char *from,unsigned char *to,
RSA *rsa,int passing)

flent :明文数据的长度字节数

from :明文数据

to  :存放生成的密文数据

rsa :公钥

padding :填充方式

RSA_public_encrypt一次性只能加密(密钥的位数 / 8 = N)字节的数据,且加密前后数据长度相等。

举例子:1024bit的密钥,一次性可加密 1024 /8=128字节,由于使用了填充,占用了11字节

因此真正加密的明文数据为128-11=117字节。

但是我们多加密几次,拼接在一起就可以了。

生成密钥对

封装了2个函数,一个生成密钥对文件,一个生成密钥对的内存数据

利用c++代码来写:


void RSAC::generateKeyPair(const QString &priKeyFile, const QString &pubKeyFile, int bits)  //生成rsa的密钥对,并将私钥和公钥保存到priKeyFile和pubKeyFile里面
{RSA* rsa = RSA_generate_key(bits, RSA_F4, nullptr, nullptr);// 生成一个密钥对,bits参数负责指定密钥长度,RSA_F4是e值,通常为65537,表示一个质数,nullptr表示不使用回调函数。BIO *bp = BIO_new(BIO_s_file());//创建一个文件类型的BIOBIO_write_filename(bp, (void*)pubKeyFile.toStdString().c_str());// 将公钥文件的路径写入BIO里面PEM_write_bio_RSAPublicKey(bp, rsa);// 将rsa公钥以pem的格式写入BIO里面BIO_free_all(bp);//释放BIO资源bp = BIO_new(BIO_s_file());BIO_write_filename(bp, (void*)priKeyFile.toStdString().c_str());PEM_write_bio_RSAPrivateKey(bp, rsa, nullptr, nullptr, 0, nullptr, nullptr);CRYPTO_cleanup_all_ex_data(); //清理Openssl的线程局部数据BIO_free_all(bp); RSA_free(rsa);//释放rsa密钥结构的内存
}void RSAC::generateKeyPair(QByteArray &privateKey, QByteArray &pubKey, int bits)
{//用于生成RSA密钥对,并将私钥和公钥分别保存在QByteArray对象中RSA *keyPair = RSA_generate_key(bits, RSA_F4, nullptr, nullptr);BIO *pri = BIO_new(BIO_s_mem()); //创建一个内存类型的BIO,用于存储私钥。BIO *pub = BIO_new(BIO_s_mem()); //创建另一个内存类型的BIO,用于存储公钥PEM_write_bio_RSAPrivateKey(pri, keyPair, nullptr, nullptr, 0, nullptr, nullptr);//将RSA私钥以PEM格式写入pri BIOPEM_write_bio_RSA_PUBKEY(pub, keyPair);//将RSA公钥以PEM格式写入pub BIOint pri_len = BIO_pending(pri);int pub_len = BIO_pending(pub);  //获取长度privateKey.resize(pri_len);pubKey.resize(pub_len);BIO_read(pri, privateKey.data(), pri_len);BIO_read(pub, pubKey.data(), pub_len);// 内存释放RSA_free(keyPair);BIO_free_all(pub);BIO_free_all(pri);
}

其实,你学习了c语言和openssl 里面的BIO接口的基本知识也就能写出来这个脚本了。

恶补一番c++,

    c++的优势,针对不同的对象去做实例化(OO思想)

面对对象的思想,面对对象来看问题,而不是针对一个个函数和变量。每个对象都是一个完整的独立的个体,它是由相关的属性和行为组合。

   封装,把对象的属性和方法结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。封装是面对对象思想的描述基础。

  抽象,对具体问题进行概括的过程,是对一类公共问题进行统一描述的过程。可以理解为一个得到所有参与活动的有效个体支持的协议。

  继承,子类对象与其基类相同的全部属性和方法。

  多态,基类中定义的属性和行为被子类继承后可以具有不同的数据类型或者表现行为等特性。

cout ,一个输出流对象,属于basic_ostream类的对象。ostream类在iostream头文件中定义

using namespace std;     名字空间,就是c++标准库所使用的所有标识符(即类、函数、对象的名称)多少在同一个名字空间(std)中定义

<<  在c语言里面左移,但是在c++里面发生了变化。

总结

   学习openssl主要可以分为两个部分,一是利用Crypto library 进行密码学相关代码进行的操作,二是利用 SSL library进对SSL、TLS的代码开发。

对于Crypto library,先要学习使用对称加密、非对称加密、数字签名、哈希函数、随机数生成,然后学习如何进行密钥的管理、密码协议的实现、并优化我们算法的性能,最后去研究如何修复密码漏洞、对密码库进行更新。

对于SSL、TLS库,加深对协议的理解,并开展一些实践比如建立安全连接、生成自签证书、配置SSL/TLS的参数、调试SSL/TLS连接,最后的话,还是归到如何对SSL/TLS进行安全审计、优化连接性能的方面。

    

参考于:https://www.cnblogs.com/yxy666/p/9606286.html

https://zhuanlan.zhihu.com/p/667217572
OpenSSL BIO介绍与使用-天翼云开发者社区 - 天翼云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484411.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

房屋租赁系统源码 SpringBoot + Vue 实现全功能解析

这是一套使用 SpringBoot 与 Vue 开发的房屋租赁系统源码,站长分析过这套源码,推测其原始版本可能是一个员工管理系统,经过二次开发后,功能被拓展和调整,现已完全适用于房屋租赁业务。 该系统功能完善,涉及房屋销售、租赁管理等。站长在测试部署过程中,发现源码结构清晰…

工业齐套管理虚拟现实仿真模拟软件

工业齐套管理虚拟现实仿真模拟软件是与法国最大的汽车制造商合作开发的一款虚拟现实仿真模拟软件&#xff0c;借助身临其境的虚拟现实环境&#xff0c;无需停止生产线&#xff0c;即可模拟仓库和提货区域。 工业齐套管理虚拟现实仿真模拟软件不仅适用于汽车工业&#xff0c;安全…

基于python爬虫的智慧人才数据分析系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 废话不多说&#xff0c;先看效果图 更多效果图可私信我获取 源码分享 import os import sysdef main():"""Run administrative tasks."""os.environ.setdefault(DJANGO…

Android 分词的两种方式

前言&#xff1a; 本文分别介绍了原生和三方(Jieba)两种分词方式的使用和注意事项 1、安卓原生BreakIterator分词 比较简单&#xff0c;但是效果不太行 /*** 功能&#xff1a;原生分词* 参数&#xff1a;text&#xff1a;需要分词的语句* 返回值&#xff1a;return&#xf…

TCP Analysis Flags 之 TCP Spurious Retransmission

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

react 路由鉴权

权限路由一般两种 1中接口中返回菜单 2 接口中返回权限&#xff0c;前端做匹配 一般都是那种结合&#xff0c;react中没有vue那种钩子函数如何做&#xff1f; 在项目中写一个高阶函数&#xff0c;在高阶函数中判断权限、是否登录等操作app.tsx或者man.tsx中使用 《AuthRouter》…

【spring mvc】全局处理请求体和响应体

目录 说明实现效果逻辑图 实现步骤创建公共处理的请求和响应的类api接口测试前端请求响应结果 扩展Response响应格式实体ResponseCode 响应状态码RSA工具类 RequestBodyAdvice 介绍使用场景 ResponseBodyAdvice 介绍使用场景 说明 由于项目中需要进行加密传输数据提高项目安全…

FlyHttp 的设计思想:前端 API 自动化构建工具

FlyHttp的相关文章&#xff1a; FlyHttp 的诞生&#xff1a;从认识各种网络请求开始 FlyHttp 的设计思想&#xff1a;前端 API 自动化构建工具 FlyHttp 的使用&#xff1a;如何高效使用 FlyHttp&#xff0c;支持 JS、TS 项目 FlyHttp 的最佳实践&#xff1a;加速项目级 API…

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案 背景概述解决方案脚本实现脚本说明使用指南注意事项在CentOS操作系统环境中,若需并发上传特定目录下的.wav文件至HTTP服务器,而系统未安装GNU parallel工具,我们可通过其他方法实现此需求。本文将介绍一种利用Sh…

springboot整合flowable工作流

1、工作流介绍 1.Flowable起源于Activiti工作流引擎&#xff0c;由Activiti的主要开发者在2016年创建。它继承了Activiti的众多优点&#xff0c;并在此基础上进行了优化和改进&#xff0c;以提供更加稳定、高效的工作流管理解决方案。Flowable与Activiti有着共同的祖先&#x…

Linux Shell 脚本题目集(2)

1、使用 case 语句根据用户输入的分数&#xff08;0-100&#xff09;输出相应的成绩等级&#xff08;A, B, C, D&#xff09;。 #! /bin/bashread -p "请输入您的分数&#xff08;0-100&#xff09;&#xff1a;" score# 验证输入是否为数字且在0到100之间 if ! [[ …

交换机四大镜像(端口镜像、流镜像、VLAN镜像、MAC镜像)应用场景、配置实例及区别对比

在网络管理中&#xff0c;端口镜像、流镜像、VLAN镜像和MAC镜像都是用于监控和分析网络流量的重要技术。 端口镜像&#xff08;Port Mirroring&#xff09; 定义&#xff1a;端口镜像是将一个或多个源端口的流量复制到一个目标端口&#xff0c;以便于网络管理员能够监控和分析…

Redis(1)

Redis是一个在内存中存储数据的中间件。 1.在内存中存储数据。 通过数据结构来存储&#xff0c;mysql通过表的方式存储数据&#xff0c;是关系型数据库&#xff0c;redis通过键值对存储&#xff0c;key的类型是string&#xff0c;value的类型是非关系型数据库。 2.可编程的 …

基于Pyside6开发一个通用的在线升级工具

UI main.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</class><widget class"QMainWindow" name"MainWindow"><property name"geometry"&…

Linux 系统/etc目录下配置文件分类

目录 一、网络相关配置文件 主机名与 IP 映射类 /etc/hosts /etc/hostname 网络接口配置类 /etc/sysconfig/network-scripts/ifcfg-ens33 DNS 相关类 /etc/resolv.conf /etc/host.conf 网络服务相关类 /etc/hosts.allow文件 /etc/hosts.deny文件 /etc/netconfig …

自由学习记录(28)

C# 中的流&#xff08;Stream&#xff09; 流&#xff08;Stream&#xff09;是用于读取和写入数据的抽象基类。 流表示从数据源读取或向数据源写入数据的矢量过程。 C# 中的流类是从 System.IO.Stream 基类派生的&#xff0c;提供了多种具体实现&#xff0c;每种实现都针对…

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…

Elasticsearch Serverless 现已正式发布

作者&#xff1a;来自 Elastic Yaru Lin 基于全新无状态&#xff08;stateless&#xff09;架构的 Elasticsearch Serverless 现已正式发布。它采用完全托管方式&#xff0c;因此你可以快速启动项目而无需操作或升级&#xff0c;并且可以使用最新的向量搜索和生成式 AI 功能。 …

Android CoordinatorLayout:打造高效交互界面的利器

目录 一、CoordinatorLayout 介绍及特点 二、使用方法 2.1 创建 CoordinatorLayout 布局 2.2 添加需要协调的子视图 2.3 自定义 Behavior 三、结语 相关推荐 在Android开发中&#xff0c;面对复杂多变的用户界面需求&#xff0c;CoordinatorLayout以其强大的交互管理能力…

基于Java Springboot旅游攻略APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…