当前位置: 首页 > news >正文

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介绍与使用-天翼云开发者社区 - 天翼云

相关文章:

openssl的运用

一、概述 Opssl是一个用于TLS/SSL协议的工具包&#xff0c;也是一个通用密码库。 包含了国密sm2 sm3 sm4&#xff0c;包含了对称加密&#xff0c;非对称加密&#xff0c;单项散列&#xff0c;伪随机、签名&#xff0c;密码交换&#xff0c;证书等一些算法库。 为了深层次的学习…...

C++STL之vector(超详细)

CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f68…...

RabbitMQ消息可靠性保证机制5--消息幂等性处理

RabbitMQ层面有实现“去重机制”来保证“恰好一次”吗&#xff1f;答案是没并没有&#xff0c;而且现在主流的消息中间件都没有实现。 一般解决重复消息的办法是&#xff1a;在消费端让我们消费消息操作具有幂等性。 幂等性问题并不是消息系统独有&#xff0c;而是&#xff0…...

24/12/1 算法笔记<强化学习> 创建Maze交互

我们今天制作一个栅格的游戏。 我们直接上代码教学。 1.载入库和查找相应的函数版本 import numpy as np import time import sysif sys.version_info.major 2:import Tkinter as tk else:import tkinter as tk 2.设置长宽和单元格大小 UNIT 40 MAZE_H 4 MAZE_W 4 3.初始…...

c++:模版 template

一、模版 1.格式&#xff1a; template <typname T> 2.实现 2.1自动推导 模板只对紧跟在后面的第一行代码有效&#xff0c;如果后面还想定义模板函数需要重新定义模板 #include <iostream> #include <string>template <typename T> void Print(T v…...

javascript切换类、删除类、修改类以及增加类

在JavaScript中&#xff0c;操作DOM元素的类&#xff08;class&#xff09;是一个常见的操作。以下是一些基本的方法来切换类、删除类、修改类以及增加内联样式&#xff1a; 切换类&#xff08;Toggle Class&#xff09; 切换类意味着如果类存在则移除它&#xff0c;如果不存…...

区块链学习笔记(2)--区块链的交易模型part1

模型基础 区块链的tx分为两种模型&#xff0c;分别是比特币为代表的UTXO&#xff08;Unspent Transaction Output&#xff09;模型&#xff0c;和以太坊为代表的Account模型。前者适用于货币记账&#xff0c;后者适用于链上应用。 UTXO模型 类似于现金的交易模型 一个tx包含…...

反射知识总结

狂神说 反射的功能&#xff1a; 类加载内存分析 类加载的时候&#xff0c;class对象就形成了。 类无论有多少对象&#xff0c;class对象只有一个。 获取类对象三种方式 反射&#xff0c;就是通过api获取一个类的类对象&#xff1a; 有三种方式&#xff1a; 方法一&#xf…...

selenium部署分布式 UI 自动化测试环境-Docker

一、根据selenium/hub官网的配置信息&#xff0c;进行配置。 How to run this image The Hub and Nodes will be created in the same network and they will recognize each other by their container name. A Docker network⁠ needs to be created as a first step.Create …...

算法刷题Day5: BM52 数组中只出现一次的两个数字

描述&#xff1a; 一个整型数组里除了两个数字只出现一次&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度O(n)。 题目传送门 is here 思路&#xff1a; 方法一&#xff1a;最简单的思路就…...

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…...

多线程篇-5--线程分类(线程类型,springboot中常见线程类型,异步任务线程)

常见的线程类型包括用户线程&#xff08;User Threads&#xff09;、守护线程&#xff08;Daemon Threads&#xff09;、主线程&#xff08;Main Thread&#xff09;、工作线程&#xff08;Worker Threads&#xff09;和线程池中的线程。 一、用户线程&#xff08;User Thread…...

详解高斯消元

详解高斯消元 好东西,可以求所有一次方程组的解。 \color {red} 好东西,可以求所有一次方程组的解。 好东西,可以求所有一次方程组的解。 前置知识 一般消元法的公理: 两方程互换,解不变; 一方程乘以非零数 k k k,解不变; 一方程乘以数 k k k加上另一方程,解不变。 …...

【Python网络爬虫笔记】5-(Request 带参数的get请求) 爬取豆瓣电影排行信息

目录 1.抓包工具查看网站信息2.代码实现3.运行结果 1.抓包工具查看网站信息 请求路径 url:https://movie.douban.com/typerank请求参数 页面往下拉&#xff0c;出现新的请求结果&#xff0c;参数start更新&#xff0c;每次刷新出20条新的电影数据 2.代码实现 # 使用网络爬…...

泷羽sec- shell编程(8) until循环以及函数基本创建调用 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

Apache Flink从Kafka中消费商品数据,并进行商品分类的数量统计题

使用Apache Flink从Kafka中消费商品数据&#xff0c;并进行商品分类的数量统计是一个典型的流处理任务。以下是一个详细的步骤指南和示例代码&#xff0c;帮助你实现这一功能。 ### 前提条件 1. **安装Flink**&#xff1a;确保你的环境中已经安装了 Apache Flink。 2. **安装…...

Ubuntu 安装 MariaDB

安装 MariaDB具体步骤 1、更新软件包索引&#xff1a; sudo apt update2、安装 MariaDB 服务器&#xff1a; sudo apt install mariadb-server3、启动 MariaDB 服务&#xff08;如果未自动启动&#xff09;&#xff1a; sudo systemctl start mariadb4、设置 MariaDB 开机启…...

GPT打字机效果—— fetchEventSouce进行sse流式请求

EventStream基本用法 与 WebSocket 不同的是&#xff0c;服务器发送事件是单向的。数据消息只能从服务端到发送到客户端&#xff08;如用户的浏览器&#xff09;。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…...

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II

Leetcode 3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路2. 代码实现 题目链接&#xff1a;3373. Maximize the Number of Target Nodes After Connecting Trees II 1. 接替思路 这一题和前一题Leetcode 3372其实整体思路上并没有啥太大…...

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中&#xff0c;constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角&#xff1a; 1. constructor 定义&#xff1a;constructor是一个函数&am…...

用c语言完成俄罗斯方块小游戏

用c语言完成俄罗斯方块小游戏 这估计是你在编程学习过程中的第一个小游戏开发&#xff0c;怎么说呢&#xff0c;在这里只针对刚学程序设计的学生&#xff0c;就是说刚接触C语言没多久&#xff0c;有一点功底的学生看看&#xff0c;简陋的代码&#xff0c;简陋的实现&#xff0…...

Leetcode打卡:N皇后

执行结果&#xff1a;通过 题目&#xff1a;51 N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...

位运算在嵌入式系统开发中的应用

目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …...

livekit 服务部署

本地起 1. 拉取生成文件镜像 sudo docker pull livekit/generate 2. 生成配置文件 sudo docker run --rm -v $PWD:/output livekit/generate --local (记住输出信息) 3. 拉取livekit/livekit-server sudo docker pull livekit/livekit-server 4. 开始运行服务 sudo docker run…...

笔记:visual studio2022编译 和 运行 VTK9.4.0

一、下载源码 VTK官网下载对应源码。 Download | VTKhttps://vtk.org/download/ 二、编译动态库&#xff08;基于Win11 24h&#xff09; 1. 用VS打开VTK源码的CMakeLists.txt&#xff0c;等待项目配置完成。 生成完毕如图 2.生成动态库&#xff0c;点击全部生成&#xff0c…...

【Linux | 计网】TCP协议深度解析:从连接管理到流量控制与滑动窗口

目录 前言&#xff1a; 1、三次握手和四次挥手的联系&#xff1a; 为什么挥手必须要将ACK和FIN分开呢&#xff1f; 2.理解 CLOSE_WAIT 状态 CLOSE_WAIT状态的特点 3.FIN_WAIT状态讲解 3.1、FIN_WAIT_1状态 3.2、FIN_WAIT_2状态 3.3、FIN_WAIT状态的作用与意义 4.理解…...

Qt Sensors 传感器控制介绍篇

文章目录 Qt Sensors 模块介绍前言 什么是 Qt Sensors&#xff1f;主要特点&#xff1a; 支持的传感器类型Qt Sensors 的核心组件应用场景优势总结 Qt Sensors 模块介绍 前言 随着现代硬件设备的不断发展&#xff0c;传感器已成为许多设备&#xff08;如智能手机、平板电脑和…...

探索3D世界:使用 lib3ds 读取和解析 3DS 文件

在3D图形开发中&#xff0c;读取和解析3DS文件是创建和渲染3D场景的第一步。3DS&#xff08;3D Studio&#xff09;文件格式是一种广泛使用的3D模型文件格式&#xff0c;它包含了多种类型的数据&#xff0c;用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开…...

【开源免费】基于SpringBoot+Vue.JS服装生产管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

计算机技术:冯·诺伊曼架构

冯诺伊曼架构&#xff08;Von Neumann Architecture&#xff09;是由著名数学家和计算机科学家约翰冯诺伊曼&#xff08;John von Neumann&#xff09;在20世纪40年代提出的一种计算机设计模型。它奠定了现代通用计算机设计的基础。 1. 核心思想 冯诺伊曼架构的核心思想是存储…...

在Window10或11系统中同时安装 JDK8 和 JDK11

在Window10或11系统中同时安装 JDK8 和 JDK11 最近写项目&#xff0c;之前的项目是用Java8环境开发的&#xff0c;在二次迭代中&#xff0c;但是新开发的项目采用Java11环境来开发&#xff0c;所以需要同时安装JDK8和JDK11环境&#xff0c;但是两个环境是不能同时使用的&#…...

Hbase2.2.7集群部署

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为Hbase主节点&#xff09;、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0&#xff0c;zookeeper版本为3.5.8 下载安装包 下载链接&#xff1a;In…...

Java学习,数据结构

Java 提供了丰富的数据结构来处理和组织数据&#xff0c;Java的 java.util 包中提供了许多这些数据结构的实现&#xff0c;可以根据需要选择合适的类。 List&#xff08;列表&#xff09; ArrayList&#xff1a;基于动态数组的数据结构&#xff0c;允许包含重复元素和 null。 …...

微众银行前端面试题及参考答案

使用的协议是 HTTP 还是 HTTPS&#xff0c;为什么没用 HTTPS&#xff1f; 在前端开发中&#xff0c;有些网站使用 HTTP 协议&#xff0c;有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高&#xff0c;或者处于开发的早期阶段&#xff0c;还没有…...

spark同步mysql数据到sqlserver

使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL&#xff08;Extract, Transform, Load&#xff09;任务。这里提供一个基本的步骤指南&#xff0c;以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**&#xff1a;确保你的环境中已经安装了…...

使用 useMemo 和 React.memo 优化 React 组件渲染

在 React 中&#xff0c;性能优化是一个重要的主题&#xff0c;特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件&#xff0c;包含两个子组件&#xff1a; MemoChild&#xff1a;使用 R…...

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…...

Bert+CRF的NER实战

CRF&#xff08;条件随机场-Conditional Random Field&#xff09; 原始本文&#xff1a;我在北京吃炸酱面 标注示例&#xff1a; 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF&#xff1a; 目的&#xff1a;提出一些不可能出现的预测组合&#xff08;例如I-PLA不能…...

python学习笔记8-函数2

参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...

【linux学习指南】详解Linux进程信号保存

文章目录 &#x1f4dd;保存信号&#x1f320; 信号其他相关常⻅概念&#x1f309;在内核中的表⽰ &#x1f320; sigset_t&#x1f320;信号集操作函数&#x1f309;sigprocmask&#x1f309;sigpending &#x1f6a9;总结 &#x1f4dd;保存信号 &#x1f320; 信号其他相关常…...

Postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这…...

ORACLE之DBA常用数据库查询

数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…...

C++之C++11新特性(三)--- 智能指针

目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…...

12 设计模式之工厂方法模式

一、什么是工厂方法模式&#xff1f; 1.定义 在软件开发中&#xff0c;设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 作为创建型设计模式之一&#xff0c;常常被用来解决对象创建问题。它通过将对象的创建交给…...

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…...

十一、快速入门go语言之接口和反射

文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中&#xff0c;字符串是最常用的数据类型之一。字符串用于表示文本数据&#xff0c;而正则表达式则是一种强大的工具&#xff0c;用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

力扣刷题TOP101:8.BM10 两个链表的第一个公共结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表&#xff0c;它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏&#xff0c;实际上背地里都偷…...

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件&#xff1f; 2 什么是⽂件&#xff1f; 3 文件分类&#xff08;1 从⽂件功能的⻆度来分类&#xff1a;程序⽂件/数据⽂件 2根据数据的组织形式&#xff1a;为⽂本⽂件/⼆进制⽂件&#xff09; 二 ⽂件的打开和关闭 1 …...

UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e

近日&#xff0c;优傲&#xff08;UR&#xff09;机器人公司立足中国市场需求&#xff0c;重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲&#xff08;UR&#xff09;一以贯之的高品质与性能特质&#xff0c;着重优化负载自重比&#xff0c;且在价格层面具竞争力&…...