OpenSSL学习笔记及在项目中的使用

OpenSSL官方命令手册:OpenSSL commands - OpenSSL Documentation

参考教程:

操作:OpenSSL的基本使用教程(一)_openssl.exe使用教程-CSDN博客

操作:Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblogs.com)

网站应用:最新OpenSSL简明教程_openssl使用教程-CSDN博客

概念

公钥和私钥

  • 公钥:可以公开分享,用于加密数据或验证数字签名。
  • 私钥:必须保密,用于解密数据或创建数字签名。
  • 关系:公钥和私钥是成对出现的,使用公钥加密的数据只能由对应的私钥解密,反之亦然。

一个完整的RSA私钥包含了以下几个关键参数:

  1. 模数(Modulus,N)
  2. 公钥指数(Public Exponent,e)
  3. 私钥指数(Private Exponent,d)
  4. 素数p(Prime 1,p)
  5. 素数q(Prime 2,q)
  6. 指数dp(Exponent 1,dp)
  7. 指数dq(Exponent 2,dq)
  8. 系数(Coefficient,qinv)

数字签名

  • 数字签名使用私钥创建,确保数据的完整性和来源的真实性。
  • 验证签名使用公钥,可以确认数据是否被篡改,并且确认数据确实来自特定的私钥持有者。

数字证书

  • 数字证书由受信任的证书颁发机构(CA)签发,包含公钥及其所有者的身份信息。
  • 证书用于验证公钥的真实性,确保其属于声明中的持有者。

对称加密和非对称加密

  • 对称加密:使用相同的密钥进行加密和解密,例如 AES、DES。
  • 非对称加密:使用一对公钥和私钥进行加密和解密,例如 RSA。
  • 对称加密速度快,适合大数据量;非对称加密安全性高,适合小数据量。

证书链

  • 证书链由一系列证书组成,确保最终用户证书的可信性。
  • 包括根证书(CA)、中间证书和最终用户证书。
  • 验证证书链时,必须从根证书到最终用户证书逐级验证。

常见文件后缀

.key:通常用于表示私钥或公钥文件。这个后缀比较通用,可以表示任何类型的加密密钥。 private.key(私钥),public.key(公钥)。

.pub:通常用于表示公钥文件。这个后缀明确指示文件包含公钥。id_rsa.pub(RSA 公钥),id_ecdsa.pub(ECDSA 公钥)。

.pri:通常用于表示私钥文件。虽然不是标准后缀,但一些系统或工具可能使用这个后缀来标识私钥文件。 private.pri

.pem: PEM(Privacy Enhanced Mail)格式文件的标准后缀,通常用于存储证书、私钥、公钥和证书链。文件内容通常以 Base64 编码并用 “-----BEGIN CERTIFICATE-----” 等标头和尾标记。cert.pem(证书),private.pem(私钥),public.pem(公钥)。

.crt:通常用于表示 X.509 证书文件。这个后缀通常用于证书文件,格式可以是 PEM 或 DER。server.crt(服务器证书),ca.crt(CA 证书)。

.csr:用于表示证书签名请求(Certificate Signing Request)文件。CSR 文件包含申请证书时的必要信息。request.csr

.der:DER(Distinguished Encoding Rules)格式文件的标准后缀,通常用于存储二进制编码的证书或密钥。不同于 PEM 格式,DER 文件是二进制格式,没有 Base64 编码。cert.der(证书),private.der(私钥)。

操作

(零)使用 OpenSSL 的流程

  1. 生成密钥对:使用 openssl genpkeyopenssl rsa 生成私钥和公钥。
  2. 创建 CSR:使用 openssl req 创建证书签名请求。
  3. 获得数字证书:通过 CA 颁发或自签名生成证书。
  4. 加密和签名:使用公钥加密数据,使用私钥签名数据。
  5. 解密和验证签名:使用私钥解密数据,使用公钥验证签名。

(一)安装OpenSSL

sudo apt install openssl
openssl version

(二)生成自签名证书

生成一张自签名证书,类似一张独一无二的会员卡。

  1. 生成私钥 私钥是证书的核心。首先生成一个2048位的RSA私钥:

    # openssl genpkey: OpenSSL命令,用于生成私钥
    # algorithm RSA: 指定使用RSA算法生成私钥
    # out private.key: 输出文件名为private.key【可选,不写的话就是直接输出到终端】
    # pkeyopt rsa_keygen_bits:2048: 指定生成2048位的RSA密钥
    openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048# 直接使用genrsa命令,就不用指定算法
    openssl genrsa -out genrsa.txt 512# 这个时候屏幕会出现一堆+.符号,这只是用来表示计算进度的输出
    # 查看私钥内容,是Base64编码格式
    cat private.key# 解析私钥,输出私钥的详细信息,包括私钥的模数(modulus)等
    openssl pkey -in private.key -text -noout# check检查私钥文件是否被修改过,如果修改了会输出RSA key not ok
    openssl rsa -in private.key -check# 输出私钥明文到文件夹中
    openssl rsa -in private.key -text -out private.txt
    

    加钥私密文件

    # 加密私钥文件,加密的密码为123456
    openssl genrsa -out genrsa.txt -des3 -passout pass:123456 512# 密码错误,无法加密,必须一致才能加密
    openssl rsa -in genrsa.txt -passin pass:13456 -check
    
  2. 生成证书签名请求(CSR) 使用私钥生成一个CSR文件,这是获得数字证书的关键步骤,CSR包含了申请者的身份信息和公钥

    # openssl req: OpenSSL命令,用于处理证书请求和生成CSR。
    # new: 生成新的CSR。
    # key private.key: 使用之前生成的私钥private.key。
    # out mycsr.csr: 输出文件名为mycsr.csr。
    openssl req -new -key private.key -out mycsr.csr# 查看CSR内容,包含Subject(组织名称等)、Public Key(公钥)、Signature(用私钥对CSR进行的数字签名,确保CSR未被篡改)
    openssl req -in mycsr.csr -noout -text
    

    在这个过程中,会被提示输入一些信息,以下字段是必填的:

    1. Country Name (2 letter code):CN
    2. State or Province Name (full name):Guangdong
    3. Locality Name (eg, city):Guangzhou
    4. Organization Name (eg, company):SCNU
    5. Common Name (e.g. server FQDN or YOUR name):Xuan

    而以下字段是可选的:

    1. Organizational Unit Name (eg, section)
    2. Email Address
    3. A challenge password
    4. An optional company name

在这里插入图片描述

  1. 生成自签名证书 使用CSR和私钥生成一个有效期为一年的自签名证书:

    # penssl x509: OpenSSL命令,用于管理X.509证书。
    # req: 表示输入是一个证书请求(CSR)。
    # days 365: 证书的有效期为365天。
    # in mycsr.csr: 输入CSR文件mycsr.csr。
    # signkey private.key: 使用private.key私钥进行签名。
    openssl x509 -req -days 365 -in mycsr.csr -signkey private.key -out mycert.crt
    

(三)基本使用

  1. 查看证书信息 使用以下命令查看证书的详细信息:

    # in mycert.crt: 输入证书文件mycert.crt。
    # text: 以文本格式显示证书内容。
    # noout: 不输出证书本身,只显示信息。
    # 数字证书包括版本号、序列号、签名算法、颁发者信息、有效期、持有者信息、公钥、证书扩展、签名等等
    openssl x509 -in mycert.crt -text -noout
    
  2. 加密文件 使用公钥加密一个文件:

    # 从证书中提取公钥
    openssl x509 -pubkey -noout -in mycert.crt > public.key# 生成测试文本文件,输入sth
    touch plaintext.txt
    / vim plaintext.txt# openssl rsautl: OpenSSL命令,用于使用RSA算法进行加密、解密操作。
    # encrypt: 进行加密操作。
    # inkey public.key: 使用public.key中的公钥。
    # pubin: 指定输入文件是公钥。
    # in plaintext.txt: 输入要加密的文件plaintext.txt。
    openssl pkeyutl -encrypt -pubin -inkey public.key -in plaintext.txt -out encrypted.dat
    
  3. 解密文件 使用私钥解密文件:

    # openssl pkeyutl: 用于使用RSA算法进行加密、解密操作。【注意3.0.x版本只能用pkeyutl不能用rsault】
    # decrypt: 进行解密操作。
    # inkey private.key: 使用私钥private.key进行解密。
    openssl pkeyutl -decrypt -inkey private.key -in encrypted.dat -out decrypted.txt# 查看解密后内容,发现和
    cat decrypted.txt
    

(四)其他使用

  1. openssl speed测试加密算法的性能

    openssl speed [md2] [mdc2] [md5] [hmac] [sha1] [rmd160] [idea-cbc] [rc2-cbc] [rc5-cbc] [bf-cbc] [des-cbc] [des-ede3] [rc4] [rsa512] [rsa1024] [rsa2048] [rsa4096] [dsa512] [dsa1024] [dsa2048] [idea] [rc2] [des] [rsa] [blowfish]
    
  2. openssl rand生成伪随机数

    openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num# 选项说明:
    # -out:指定随机数输出文件,否则输出到标准输出。
    # -rand file:指定随机数种子文件。种子文件中的字符越随机,openssl rand生成随机数的速度越快,随机度越高。
    # -base64:指定生成的随机数的编码格式为base64。
    # -hex:指定生成的随机数的编码格式为hex。
    # - num:指定随机数的长度。openssl rand -base64 30;
    openssl rand -hex 30;
    openssl rand 30
    
  3. openssl passwd 生成加密的密码

    openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-quiet] {password}# 生成默认的密码哈希(使用 DES 加密)
    openssl passwd -1 "password"
    # 生成使用 SHA-256 的密码哈希
    openssl passwd -6 "password"
    # 生成盐(salt)并使用其生成密码哈希【盐相同,密码相同】
    openssl passwd -salt mysalt -1 "password"
    # 交互式输入密码
    openssl passwd -1
    
  4. openssl dgst 生成和验证数字签名

    openssl dgst [-md5|-sha1|...] [-hex | -binary] [-out filename] [-sign filename] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [file...]# -sign filename:使用指定的私钥文件对哈希值进行签名
    # -verify filename:使用指定的公钥文件来验证签名
    # -prverify filename:同上,可以指定密钥文件的密码。
    # -signature filename:指定签名文件,以便与数据一起用于验证签名# 计算文件.txt 的 SHA-256 哈希并将结果写入 hash.txt 文件:
    dgst -sha256 -hex (-out hash.txt) plaintext.txt # 使用私钥对plaintext.txt生成签名,并将签名保存到signature.sig 中【使用-sign签名时绝对不能加-hex,不然后面验签一定会失败】
    openssl dgst -sha256 -sign private.key -out signature.sig plaintext.txt# 使用公钥 public.key 验证签名 signature.sig,输出verified.ok即签名有效
    openssl dgst -sha256 -verify public.key -signature signature.sig plaintext.txt # 使用密码保护的私钥
    openssl dgst -sha256 -sign private.key -passin pass:yourpassword -out signature.sig example.txt
  5. openssl rsautl和openssl pkeyutl:文件的非对称加密

    rsautl是rsa的工具,相当于rsa、dgst的部分功能集合,可用于生成数字签名、验证数字签名、加密和解密文件。

    pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多

    
    

项目实践

(一)在SpringBoot中使用

  1. OpenSSL生成密钥和证书,配置HTTPS
# application.yml
server:ssl:key-store: classpath:keystore.p12key-store-password: yourpasswordkey-store-type: PKCS12key-alias: youralias
  1. 在JWT中使用(JWT详细介绍可见:浅析JWT原理及牛客出现过的相关面试题-CSDN博客),在Spring Boot应用中使用JWT进行认证和授权时,可以使用生成的私钥和公钥进行签名和验证。
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class JwtUtil {private static final String PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----";private static final String PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----";// 从PEM格式的字符串中解析并返回私钥private static PrivateKey getPrivateKey() throws Exception {String privateKeyPEM = PRIVATE_KEY.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s", "");byte[] encoded = Base64.getDecoder().decode(privateKeyPEM);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePrivate(keySpec);}// 从PEM格式的字符串中解析并返回公钥private static PublicKey getPublicKey() throws Exception {String publicKeyPEM = PUBLIC_KEY.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replaceAll("\\s", "");byte[] encoded = Base64.getDecoder().decode(publicKeyPEM);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePublic(keySpec);}// 使用私钥生成JWT令牌public static String generateToken(String subject) throws Exception {return Jwts.builder().setSubject(subject).signWith(getPrivateKey(), SignatureAlgorithm.RS256).compact();}// 使用公钥验证JWT令牌public static boolean validateToken(String token) throws Exception {Jwts.parserBuilder().setSigningKey(getPublicKey()).build().parseClaimsJws(token);return true;}
}

(二)在区块链项目中使用

使用私钥对交易进行签名。使用Java的Bouncy Castle库进行签名

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.*;
import java.util.Base64;public class TransactionSigner {static {Security.addProvider(new BouncyCastleProvider());}// 使用私钥对交易数据进行签名public static String signTransaction(String transactionData, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA", "BC");signature.initSign(privateKey);signature.update(transactionData.getBytes());byte[] signatureBytes = signature.sign();return Base64.getEncoder().encodeToString(signatureBytes);}// 使用公钥验证交易数据的签名public static boolean verifySignature(String transactionData, String signatureStr, PublicKey publicKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA", "BC");signature.initVerify(publicKey);signature.update(transactionData.getBytes());byte[] signatureBytes = Base64.getDecoder().decode(signatureStr);return signature.verify(signatureBytes);}// 从PEM格式的字符串中解析并返回私钥public static PrivateKey getPrivateKey(String privateKeyPEM) throws Exception {String privateKey = privateKeyPEM.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s", "");byte[] encoded = Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePrivate(keySpec);}// 从PEM格式的字符串中解析并返回公钥public static PublicKey getPublicKey(String publicKeyPEM) throws Exception {String publicKey = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replaceAll("\\s", "");byte[] encoded = Base64.getDecoder().decode(publicKey);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePublic(keySpec);}public static void main(String[] args) throws Exception {String transactionData = "example transaction data";String privateKeyPEM = "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----";String publicKeyPEM = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----";PrivateKey privateKey = getPrivateKey(privateKeyPEM);PublicKey publicKey = getPublicKey(publicKeyPEM);String signature = signTransaction(transactionData, privateKey);boolean isVerified = verifySignature(transactionData, signature, publicKey);System.out.println("Signature: " + signature);System.out.println("Signature Verified: " + isVerified);}
}

TIPS/BUGS

验证openssl version时报错version not found

背景:在使用openssl version时出现openssl: /lib/x86_64-linux-gnu/libcrypto.so.3: version OPENSSL_3.0.9' not found (required by openssl)

原因:出现这个错误是因为系统中的OpenSSL版本与所需的库版本不匹配。具体来说,系统中的OpenSSL依赖于版本 OPENSSL_3.0.9 的库文件 /lib/x86_64-linux-gnu/libcrypto.so.3,但系统中可能没有这个版本的库文件,或者库文件版本不正确。

解决办法:

# 1. 更新
sudo apt upgrade openssl# 2. 重装
sudo apt remove --purge openssl
sudo apt install openssl

加密时报错Could not read public key from mycert.crt

意思是在证书中读取不到公钥,这种情况就把公钥提取出来,再用公钥文件加密即可

# 从证书中提取公钥
openssl x509 -pubkey -noout -in mycert.crt > public.key# 加密
openssl pkeyutl -encrypt -pubin -inkey public.key -in plaintext.txt -out encrypted.dat

openssl genrsaopenssl genpkey -algorithm rsa有什么区别?

openssl pkey 更通用,可以处理多种私钥
openssl rsa 专门处理RSA密钥

openssl-genpkey - OpenSSL Documentation明确指出应使用genpkey,而不是特定于算法的 genrsa

The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.

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

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

相关文章

【MR】现代机器人学-时间最优时间缩放

MR章节目录 第2章 配置空间 第3章 刚体运动 第4章 正向运动学 第5章 速度运动学与静力学 第6章 逆向运动学 第7章 闭链运动学 第8章 开链动力学 第9章 轨迹生成 9.1 定义 9.2 点到点轨迹 9.3 多项式通过点轨迹 9.4 时间最优时间缩放 第10章 运动规划 第11章 机器人控制 第12章 …

20 Python常用内置函数——eval()

内置函数 eval() 函数用来计算字符串的值,在有些场合也可以用来实现类型转换的功能。除此之外,eval() 也可以对字节串进行求值,还可以执行内置函数 compile() 编译生成的代码对象。 print(eval(b35)) print([eval(8), type(eval(8))]) # 把…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间,生成30个数 y…

构建现代数据湖

现代数据湖是一半数据仓库和一半数据湖,对所有事情都使用对象存储。使用对象存储来构建数据仓库是通过 Open Table Formats OTF) 实现的,例如 Apache Iceberg、Apache Hudi 和 Delta Lake,这些规范一旦实现,就可以无缝…

PHP基础语法-Part1

脚本格式 PHP脚本以<?php开头&#xff0c;以?>结尾&#xff1b; PHP语句以分号结尾&#xff08;;&#xff09; PHP是解释型语言&#xff1b; 输入和输出 获取用户的输入&#xff1a; $input readline("input:"); echo $input; echo "input:";…

Github 2024-07-26开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目2TypeScript项目2C++项目2HTML项目1Python项目1C#项目1Lua项目1JavaScript项目1Vue项目1C项目1免费编程学习平台:freeCodeCamp.org 创…

为什么很多人在一定年龄后的肥胖无法避免

人体在营养均衡状态的时候&#xff0c;是不容易长胖的&#xff0c;且身体也远比一般人更健康些&#xff0c;但想要一直维持身体的这种健康均衡的状态&#xff0c;不仅生活上要很有规律&#xff0c;饮食上也要营养均衡才行。但以如今社会的快节奏生活而言&#xff0c;基本没有人…

计算机毕业设计-程序论文-基于 Java 的高校教资报名系统的设计与实现

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码&#xff0c;请关注❥点赞收藏并私信博主&#x…

软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点

场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…

AI 正在取代工作岗位、ChatBot 进入厌倦期、向量数据库崛起,人工智能现状报告有这些重要发现!...

作者 | Echo Tang&GPT 出品丨AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 百度的无人驾驶“萝卜快跑”已经在武汉大面积推广&#xff0c;在部分城市进行小量的试运行&#xff0c;以低廉的价格直接卷翻滴滴、出租车司机&#xff0c;让人们热议“五年、十…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

研0 冲刺算法竞赛 day22 P1928 外星密码

P1928 外星密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;递归处理&#xff0c;分类处理 代码&#xff1a; #include<iostream> #include<stack> using namespace std; #include <cstring> char copl[20005];string handle() {int …

全网最详细!! Linux 安装、配置教程

一、下载安装包 首先去官网下载VMware最新版本&#xff0c;以及发行版CentOS -7&#xff0c;懒得下载的可以私信我&#xff0c;我给你发包 其中&#xff0c;CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个基于Linux的开源操作系统&#xff0c;它是…

华为OD机试 - 停车场车辆统计 - 贪心算法(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华…

微服务注册中心

目录 1.微服务的注册中心 1.1 注册中⼼的主要作⽤ 1.2 常⻅的注册中⼼ 2.nacos简介 2.1 nacos实战⼊⻔ 2.2.1 搭建nacos环境 2.2.2 将商品微服务注册到nacos 3.服务调⽤Ribbon⼊⻔ 3.1 Ribbon概述 3.1.1 什么是Ribbon 3.1.2 Ribbon的主要作⽤ 3.2.2 ⼯程改造 4.服务…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

C语言-TCP通信创建流程

TCP通信创建流程 1. 客户端创建TCP连接 在整个流程中, 主要涉及以下⼏个接⼝socket() : 创建套接字, 使⽤的套接字类型为流式套接字connect() : 连接服务器send() : 数据发送recv() : 数据接收创建套接字 首先&#xff0c;我们需要创建套接字&#xff0c;套接字是通信的基础…

构建查询洞察 UI

本文字数&#xff1a;2631&#xff1b;估计阅读时间&#xff1a;7 分钟 作者&#xff1a;Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现&#xff0c;为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…