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

【ROS2】高级:安全-理解安全密钥库

目标:探索位于 ROS 2 安全密钥库中的文件。

 教程级别:高级

 时间:15 分钟

 内容

  •  背景

  • 安全工件位置

    •  公钥材料

    •  私钥材料

    • 域治理政策

    •  安全飞地

  •  参加测验!

 背景 

在继续之前,请确保您已完成设置安全教程。

sros2 包可以用来创建启用 ROS 2 安全性所需的密钥、证书和策略。然而,安全配置非常灵活。对 ROS 2 安全密钥库的基本理解将允许与现有的 PKI(公钥基础设施)集成,并根据组织政策管理敏感密钥材料。

安全工件位置

之前的教程中启用通信安全后,让我们来看看启用安全性时创建的文件。这些文件使加密成为可能。

cxy@cxy-Ubuntu2404:~/sros2_demo$ sudo apt install tree
cxy@cxy-Ubuntu2404:~/sros2_demo$ tree
.
└── demo_keystore├── enclaves│   ├── governance.p7s│   ├── governance.xml│   └── talker_listener│       ├── listener│       │   ├── cert.pem│       │   ├── governance.p7s -> ../../governance.p7s│       │   ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│       │   ├── key.pem│       │   ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│       │   ├── permissions.p7s│       │   └── permissions.xml│       └── talker│           ├── cert.pem│           ├── governance.p7s -> ../../governance.p7s│           ├── identity_ca.cert.pem -> ../../../public/identity_ca.cert.pem│           ├── key.pem│           ├── permissions_ca.cert.pem -> ../../../public/permissions_ca.cert.pem│           ├── permissions.p7s│           └── permissions.xml├── private│   ├── ca.key.pem│   ├── identity_ca.key.pem -> ca.key.pem│   └── permissions_ca.key.pem -> ca.key.pem└── public├── ca.cert.pem├── identity_ca.cert.pem -> ca.cert.pem└── permissions_ca.cert.pem -> ca.cert.pem8 directories, 22 files

c89ea15f12e7749d4c42da826f1e758b.png

sros2 实用程序 ( ros2 security ... ) 将文件分为公共、私有和飞地密钥材料

ROS 使用由环境变量 ROS_SECURITY_KEYSTORE 定义的目录作为密钥库。在本教程中,我们使用目录 ~/sros2_demo/demo_keystore 。

公钥材料

您将在 ~/sros2_demo/demo_keystore/public 的公共目录中找到三个加密证书;然而,身份和权限证书实际上只是指向证书颁发机构(CA)证书的链接

在公钥基础设施中,证书颁发机构充当信任锚:它验证参与者的身份和权限。对于 ROS,这意味着所有参与 ROS 图的节点(可能扩展到整个单机器人舰队)。通过将证书颁发机构的证书( ca.cert.pem )放置在机器人上的适当位置,所有 ROS 节点都可以使用相同的证书颁发机构与其他节点建立相互信任。

虽然在我们的教程中我们会即时创建证书颁发机构,但在生产系统中,这应该根据预定义的安全计划进行。通常,生产系统的证书颁发机构将离线创建,并在初始设置期间放置在机器人上。它可能是每个机器人独有的,或者在一群机器人之间共享,所有这些机器人都旨在相互信任。

DDS(以及扩展的 ROS)支持身份和权限信任链的分离,因此每个功能都有自己的证书颁发机构。在大多数情况下,ROS 系统安全计划不需要在这些职责之间进行分离,因此安全实用程序生成一个用于身份和权限的单一证书颁发机构。

使用 openssl 查看此 x509 证书并将其显示为文本:

cd ~/sros2_demo/demo_keystore/public
openssl x509 -in ca.cert.pem -text -noout

输出应类似于以下内容: 

3ebc9337025db5a6bdf718aaf160924d.png

Certificate:Data:Version: 3 (0x2)Serial Number:02:8e:9a:24:ea:10:55:cb:e6:ea:e8:7a:c0:5f:58:6d:37:42:78:aaSignature Algorithm: ecdsa-with-SHA256Issuer: CN = sros2CAValidityNot Before: Jun  1 16:57:37 2021 GMTNot After : May 31 16:57:37 2031 GMTSubject: CN = sros2CASubject Public Key Info:Public Key Algorithm: id-ecPublicKeyPublic-Key: (256 bit)pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32ASN1 OID: prime256v1NIST CURVE: P-256X509v3 extensions:X509v3 Basic Constraints: criticalCA:TRUE, pathlen:1Signature Algorithm: ecdsa-with-SHA25630:45:02:21:00:d4:fc:d8:45:ff:a4:51:49:98:4c:f0:c4:3f:e0:e7:33:19:8e:31:3c:d0:43:e7:e9:8f:36:f0:90:18:ed:d7:7d:02:20:30:84:f7:04:33:87:bb:4f:d3:8b:95:61:48:df:83:4b:e5:92:b3:e6:ee:3c:d5:cf:30:43:09:04:71:bd:dd:7c
  • 关于此 CA 证书的一些注意事项:

    • 证书主题名称 sros2CA 是 sros2 实用程序提供的默认名称

    • 此证书自创建之日起有效期为十年

    • 像所有证书一样,这包含用于公私钥加密的公钥

    • 作为根证书颁发机构,这是一个自签名证书 https://en.wikipedia.org/wiki/Self-signed_certificate ;即,它是使用自己的私钥签名的。

由于这是一个公共证书,因此可以根据需要自由复制,以在整个 ROS 系统中建立信任。

私钥材料

私钥材料可以在密钥库目录 ~/sros2_demo/demo_keystore/private 中找到。与 public 目录类似,其中包含一个证书颁发机构密钥 ca.key.pem 及其符号链接,用作身份和权限 CA 私钥。

 警告

保护此私钥并创建其安全备份!

这是与公共证书颁发机构相关的私钥,它作为您 ROS 系统中所有安全性的锚点。您将使用它来修改 ROS 图的加密策略并添加新的 ROS 参与者。根据您的机器人安全需求,可以通过访问权限保护密钥并将其锁定到另一个帐户,或者可以将其完全移出机器人并移到另一个系统或设备上如果文件丢失,您将无法更改访问权限并向系统添加新参与者。同样,任何拥有文件访问权限的用户或进程都可以修改系统策略和参与者。

此文件仅用于配置机器人,但机器人运行时不需要。它可以安全地离线存储在另一个系统或可移动介质中。

sros2 实用程序使用椭圆曲线密码术而不是 RSA,以提高安全性并减少密钥大小。使用以下命令显示有关此椭圆曲线私钥的详细信息:

cd ~/sros2_demo/demo_keystore/private
openssl ec -in ca.key.pem -text -noout

cd85bc8774d27b9cea6a713e9dde6ecf.png

您的输出应类似于以下内容: 

read EC key
Private-Key: (256 bit)
priv:93:da:76:b9:e3:91:ab:e9:42:76:f2:38:f1:9d:94:90:5e:b5:96:7b:7f:71:ee:13:1b:d4:a0:f9:48:fb:ae:77
pub:04:71:e9:37:d7:32:ba:b8:a0:97:66:da:9f:e3:c4:08:4f:7a:13:59:24:c6:cf:6a:f7:95:c5:cd:82:c0:7f:7f:e3:90:dd:7b:0f:77:d1:ee:0e:af:68:7c:76:a9:ca:60:d7:1e:2c:01:d7:bc:7e:e3:86:2a:9f:38:dc:ed:39:c5:32
ASN1 OID: prime256v1
NIST CURVE: P-256

除了私钥本身,请注意列出了公钥,并且它与证书颁发机构 ca.cert.pem 中列出的公钥匹配。

域治理政策

在密钥库的飞地目录中找到域治理策略, ~/sros2_demo/demo_keystore/enclaves 。 enclave 目录包含 XML 治理策略文档 governance.xml ,以及由权限 CA 签署的文档副本 governance.p7s 。

governance.p7s 文件包含域范围的设置,例如如何处理未经身份验证的参与者、是否加密发现以及访问主题的默认规则。

使用以下命令验证治理文件的 S/MIME 签名:

openssl smime -verify -in governance.p7s -CAfile ../public/permissions_ca.cert.pem

ec6483793bc03fbb09267e7ef48388b1.png

 a32b6cc8e9b8ac0a8e8389272d1b3e55.png

安全飞地

安全进程(通常是 ROS 节点)在安全飞地内运行。在最简单的情况下,所有进程可以合并到同一个飞地中,所有进程将使用相同的安全策略。然而,为了对不同的进程应用不同的策略,可以在启动时使用不同的安全飞地。有关安全飞地的更多详细信息,请参阅设计文档https://design.ros2.org/articles/ros2_security_enclaves.html 。运行节点时,通过使用 ROS 参数 --enclave 来指定安全飞地。

每个安全飞地需要六个文件才能启用安全性。每个文件必须按下文定义的名称命名,并按照 DDS 安全标准中的规定进行命名。为了避免拥有多个相同文件的副本, sros2 实用程序为每个飞地创建到单个治理策略、身份 CA 和权限 CA 的链接。

1e19bbef9da71c20335dce7754626b57.png

请参阅 listener 飞地内的以下六个文件。三个是特定于此飞地的,而三个是此 ROS 系统的通用文件:

  • key.pem ,用于在此飞地内加密和解密的私钥

  • cert.pem ,此飞地的公共证书;此证书已由身份 CA 签署

  • permissions.p7s ,此飞地的权限;此文件已由权限 CA 签名

  • governance.p7s ,此域的已签署安全策略文件的链接

  • identity_ca.cert.pem, 此域的身份 CA 链接

  • permissions_ca.cert.pem ,此域的权限 CA 链接

私钥 key.pem 应根据您的安全计划进行保护。此密钥用于加密、解密和验证此特定飞地内的通信。如果密钥丢失或被盗,请撤销该密钥并为此飞地创建一个新身份。

该目录中还创建了文件 permissions.xml ,可用于重新创建签名的权限文件。但是,由于 DDS 使用的是文件的签名版本,因此不需要此文件来启用安全性。

参加测验!

看看你能否回答这些关于 ROS 安全密钥库的问题。首先,打开一个新的终端会话,并启用在前面的教程中创建的密钥库的安全性

export ROS_SECURITY_KEYSTORE=~/sros2_demo/demo_keystore
export ROS_SECURITY_ENABLE=true
export ROS_SECURITY_STRATEGY=Enforcecd ~/sros2_demo/demo_keystore/enclaves/talker_listener/listener

在开始之前,请先备份 permissions.p7s 

MIME-Version: 1.0
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="===============1982425736132065620=="This is an S/MIME signed message--===============1982425736132065620==
Content-Type: text/plain<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.omg.org/spec/DDS-SECURITY/20170901/omg_shared_ca_permissions.xsd"><permissions><grant name="/talker_listener/listener"><subject_name>CN=/talker_listener/listener</subject_name><validity><not_before>2024-07-19T03:38:43</not_before><not_after>2034-07-18T03:38:43</not_after></validity><allow_rule><domains><id>0</id></domains><publish><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></publish><subscribe><topics><topic>rq/*/_action/cancel_goalRequest</topic><topic>rq/*/_action/get_resultRequest</topic><topic>rq/*/_action/send_goalRequest</topic><topic>rq/*Request</topic><topic>rr/*/_action/cancel_goalReply</topic><topic>rr/*/_action/get_resultReply</topic><topic>rr/*/_action/send_goalReply</topic><topic>rt/*/_action/feedback</topic><topic>rt/*/_action/status</topic><topic>rr/*Reply</topic><topic>rt/*</topic></topics></subscribe></allow_rule><allow_rule><domains><id>0</id></domains><publish><topics><topic>ros_discovery_info</topic></topics></publish><subscribe><topics><topic>ros_discovery_info</topic></topics></subscribe></allow_rule><default>DENY</default></grant></permissions>
</dds>--===============1982425736132065620==
Content-Type: application/x-pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"MIICsAYJKoZIhvcNAQcCoIICoTCCAp0CAQExDzANBglghkgBZQMEAgEFADALBgkq
hkiG9w0BBwGgggE/MIIBOzCB4qADAgECAhR8Qa0j+Lrcm8xeZkyz9p/bZMWhVzAK
BggqhkjOPQQDAjASMRAwDgYDVQQDDAdzcm9zMkNBMB4XDTI0MDcxOTAzMjQxNFoX
DTM0MDcxODAzMjQxNFowEjEQMA4GA1UEAwwHc3JvczJDQTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABPMaf1j/SYjdKa+wt8L7SPedfo1UR2bEm0MoUKU8Yaiep+AC
1Uwaza61Gsvuq68t+3gy+i75zwwkj76n+77PV8ejFjAUMBIGA1UdEwEB/wQIMAYB
Af8CAQEwCgYIKoZIzj0EAwIDSAAwRQIhALNRE/bqkCIvf1xD3E8s/1HqS1FY4Q31
dX+C9FMYNn+ZAiBHNtYoBAmu8lU6/+Ux+26wBdKEf+PEJs45EtgNd08UDDGCATUw
ggExAgEBMCowEjEQMA4GA1UEAwwHc3JvczJDQQIUfEGtI/i63JvMXmZMs/af22TF
oVcwDQYJYIZIAWUDBAIBBQCggZswGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMjQwNzIwMDMzODQzWjAvBgkqhkiG9w0BCQQxIgQgkeLS
0XqZO+LEtvmMJumjB+dkzkMPosQzWIvdotfJQ5QwMAYJKoZIhvcNAQkPMSMwIQYJ
YIZIAWUDBAEqBglghkgBZQMEARYGCWCGSAFlAwQBAjAKBggqhkjOPQQDAgRHMEUC
IEcVdGZIK9qOIeMkw5tvyMmIt/UBfqcnMiakwXWBxXMZAiEA+nItvq7n5WkgPHrc
mTBX0DlOac3CwCrv4/aJS32PPN0=--===============1982425736132065620==--

这个 permissions.p7s 文件是一个 S/MIME 签名的消息,包含了 ROS2 的权限策略。以下是详细解释:

MIME 头部

  • MIME-Version: 1.0:MIME 版本。

  • Content-Type: multipart/signed; protocol=“application/x-pkcs7-signature”; micalg=“sha-256”; boundary=“===============1982425736132065620==”:表示这是一个多部分签名的消息,使用 SHA-256 算法进行签名,边界字符串用于分隔消息的不同部分。

消息内容

  • This is an S/MIME signed message:说明这是一个 S/MIME 签名的消息。

第一部分:权限策略

  • Content-Type: text/plain:内容类型为纯文本。

权限策略 XML

这个 XML 文件定义了 /talker_listener/listener 节点的权限,包括允许发布和订阅的主题,以及权限的有效期。

第二部分:签名

  • Content-Type: application/x-pkcs7-signature; name=“smime.p7s”:内容类型为 PKCS#7 签名。

  • Content-Transfer-Encoding: base64:内容传输编码为 base64。

  • Content-Disposition: attachment; filename=“smime.p7s”:附件的文件名为 smime.p7s

签名内容

这是一个 base64 编码的签名,用于验证上述权限策略的完整性和真实性。

问题 1 

在文本编辑器中打开 permissions.p7s 。对 XML 内容进行微小的更改(例如,添加一个空格或空行)并保存文件。启动监听节点:

ros2 run demo_nodes_cpp listener --ros-args --enclave /talker_listener/listener

你期望会发生什么?

你能启动 talker 节点吗?

ros2 run demo_nodes_cpp talker --ros-args --enclave /talker_listener/talker

启动监听器和启动说话者之间有什么区别?

答案 1

侦听器无法启动并抛出错误。当 permissions.p7s 文件被修改时——无论多么微小——文件的签名变得无效。当权限文件无效时,节点将无法在启用和强制安全的情况下启动。

326d23390cf17e048812da6ea701027e.png

讲话者将按预期开始。它在不同的飞地中使用 permissions.p7s 文件,并且该文件仍然有效。

 问题 2 

什么命令可以让你检查修改后的 permissions.p7s 文件上的签名是否有效?

答案 2

检查 permissions.p7s 是否已使用 openssl smime 命令由权限 CA 正确签名

openssl smime -verify -in permissions.p7s -CAfile permissions_ca.cert.pem

65ccacd13d2123b0fc0180ba2d998cee.png

3eefee19a01157368b2800470e218716.png

在继续下一个教程之前,请恢复您原始的、正确签名的 permissions.p7s 文件。

相关文章:

【ROS2】高级:安全-理解安全密钥库

目标&#xff1a;探索位于 ROS 2 安全密钥库中的文件。 教程级别&#xff1a;高级 时间&#xff1a;15 分钟 内容 背景安全工件位置 公钥材料 私钥材料域治理政策 安全飞地 参加测验&#xff01; 背景 在继续之前&#xff0c;请确保您已完成设置安全教程。 sros2 包可以用来创…...

C语言 ——— 数组指针的定义 数组指针的使用

目录 前言 数组指针的定义 数组指针的使用 前言 之前有编写过关于 指针数组 的相关知识 C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 指针数组 顾名思义就是 存放指针的数组 那什么是数组指针呢&#xff1f; 数组指针的定义 何为数组指针&#xf…...

opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习

前言 AIS_ManipulatorOwner是OpenCascade中的一个类&#xff0c;主要用于操纵对象的交互控制。AIS_ManipulatorOwner结合AIS_Manipulator类&#xff0c;允许用户通过可视化工具&#xff08;如旋转、平移、缩放等&#xff09;来操纵几何对象。 以下是AIS_ManipulatorOwner的基…...

如何防止用户通过打印功能复制页面文字

简单防白嫖&#xff0c;要让打印出来的页面是空白&#xff0c;通常的做法是在打印时隐藏页面上的所有内容。这可以通过CSS的媒体查询&#xff08;Media Queries&#xff09;来实现&#xff0c;特别是针对media print的查询。 在JavaScript中&#xff0c;你通常不会直接控制打印…...

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …...

基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)

构建监控平台数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 监控平台的数据可视化对于实时掌握系统状态、快速响应问题至关重要。通过直观的数据展示&#xff0c;运维团队可以迅速发现异常&#xff0c;优化资源配置。本文将详细介绍如何利用 HTML 和 ECharts 实现一个…...

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植&#xff0c;并不对sfud的移植再进行过多的讲解了哦&#xff0c;所以如果想了解sfud的移植过程&#xff0c;请参考我的另外一篇文章&#xff1a;传送门 正文开始咯 首先我们需要先准备资料准备好&#xff0c;这里对于fatfs的…...

MySQL之视图和索引实战

1.新建数据库 mysql> create database myudb5_indexstu; Query OK, 1 row affected (0.01 sec) mysql> use myudb5_indexstu; Database changed 2.新建表 1.学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在…...

快速参考:用C# Selenium实现浏览器窗口缩放的步骤

背景介绍 在现代网络环境中&#xff0c;浏览器自动化已成为数据抓取和测试的重要工具。Selenium作为一个强大的浏览器自动化工具&#xff0c;能够与多种编程语言结合使用&#xff0c;其中C#是非常受欢迎的选择之一。在实际应用中&#xff0c;我们常常需要调整浏览器窗口的缩放…...

MyBatis 插件机制、分页插件如何实现的

MyBatis 插件机制允许开发者在 SQL 执行的各个阶段&#xff08;如预处理、执行、结果处理等&#xff09;中插入自定义逻辑&#xff0c;从而实现对 MyBatis 行为的扩展和增强。以下是 MyBatis 插件运行原理的详细介绍&#xff1a; 插件接口 MyBatis 插件通过实现 org.apache.i…...

CentOS6.0安装telnet-server启用telnet服务

CentOS6.0安装telnet-server启用telnet服务 一步到位 fp"/etc/yum.repos.d" ; cp -a ${fp} ${fp}.$(date %0y%0m%0d%0H%0M%0S).bkup echo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.163.com/centos-vault/6.0/os/$basearch/http://mirrors.a…...

H5+CSS+JS工作性价比计算器

工作性价比&#xff1d;平均日新x综合环境系数/35 x(工作时长&#xff0b;通勤时长—0.5 x摸鱼时长) x学历系数 如果代码中的公式不对&#xff0c;请指正 效果图 源代码 <!DOCTYPE html> <html> <head> <style> .calculator { width: 300px; padd…...

Linux:基础命令学习

目录 一、ls命令 实例&#xff1a;-l以长格式显示文件和目录信息 实例&#xff1a;-F根据文件类型在列出的文件名称后加一符号 实例&#xff1a; -R 递归显示目录中的所有文件和子目录。 实例&#xff1a; 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…...

遇到Websocket就不会测了?别慌,学会这个Jmeter插件轻松解决....

websocket 是一种双向通信协议&#xff0c;在建立连接后&#xff0c;websocket服务端和客户端都能主动向对方发送或者接收数据&#xff0c;而在http协议中&#xff0c;一个request只能有一个response&#xff0c;而且这个response也是被动的&#xff0c;不能主动发起。 websoc…...

高性能 Java 本地缓存 Caffeine 框架介绍及在 SpringBoot 中的使用

在现代应用程序中&#xff0c;缓存是一种重要的性能优化技术&#xff0c;它可以显著减少数据访问延迟&#xff0c;降低服务器负载&#xff0c;提高系统的响应速度。特别是在高并发的场景下&#xff0c;合理地使用缓存能够有效提升系统的稳定性和效率。 Caffeine 是一个高性能的…...

Http 和 Https 的区别(图文详解)

在现代网络通信中&#xff0c;保护数据的安全性和用户的隐私是至关重要的。HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是两种常见的网络通信协议&#xff0c;但它们在数据保护方面的能力存在…...

DP学习——外观模式

学而时习之&#xff0c;温故而知新。 外观模式 角色 2个角色&#xff0c;外观类&#xff0c;子系统类。 个人理解 感觉就是对外接口封装&#xff0c;这个是封装一个功能的对外接口&#xff0c;越简单越好&#xff0c;提供给第三方用。 应用场景 封装为对外库时&#xff…...

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …...

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 服务端配置&#xff1a; 客户端测试&#xff1a; 2、搭建一个Web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置&#xff1a; 客户端…...

C++的UI框架和开源项目介绍

文章目录 1.QT2.wxWidgets3.Dear ImGui 1.QT QT的开源项目&#xff1a;QGIS&#xff08;地理信息系统&#xff09; https://github.com/qgis/QGIS?tabreadme-ov-file 2.wxWidgets wxWidgets的开源项目&#xff1a;filezilla https://svn.filezilla-project.org/svn/ wxWidg…...

SpringBoot连接PostgreSQL+MybatisPlus入门案例

项目结构 一、Java代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…...

vue3里将table表格中的数据导出为excel

想要实现前端对表格中的数据进行导出&#xff0c;这里推荐使用xlsx这个依赖库实现。 1、安装 pnpm install xlsx 2、使用 import * as XLSX from "xlsx"; 直接在组件里导入XLSX库&#xff0c;然后给表格table通过ref创建响应式数据拿到table实例&#xff0c;将实…...

【算法】分布式共识Paxos

一、引言 在分布式系统中&#xff0c;一致性是至关重要的一个问题。Paxos算法是由莱斯利兰伯特&#xff08;Leslie Lamport&#xff09;在1990年提出的一种解决分布式系统中一致性问题的算法。 二、算法原理 Paxos算法的目标是让一个分布式系统中的多个节点就某个值达成一致。算…...

软考:软件设计师 — 5.计算机网络

五. 计算机网络 1. OSI 七层模型 层次名称主要功能主要设备及协议7应用层实现具体的应用功能 POP3、FTP、HTTP、Telent、SMTP DHCP、TFTP、SNMP、DNS 6表示层数据的格式与表达、加密、压缩5会话层建立、管理和终止会话4传输层端到端的连接TCP、UDP3网络层分组传输和路由选择 三…...

C++ //练习 15.28 定义一个存放Quote对象的vector,将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。

C Primer&#xff08;第5版&#xff09; 练习 15.28 练习 15.28 定义一个存放Quote对象的vector&#xff0c;将Bulk_quote对象传入其中。计算vector中所有元素总的net_price。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&am…...

Midjourney绘画提示词精选

Midjourney绘画提示词精选 在探索Midjourney这一强大的AI绘画工具时&#xff0c;选择合适的提示词是创作出令人惊艳作品的关键。这些提示词不仅能够帮助Midjourney理解你的创作意图&#xff0c;还能引导它生成出符合你期望的图像。以下是对Midjourney绘画提示词的精选与解析&a…...

Kylin中的RBAC:为大数据安全加把锁

Kylin中的RBAC&#xff1a;为大数据安全加把锁 Apache Kylin是一个开源的分布式分析引擎&#xff0c;旨在为Hadoop平台提供快速的大数据量SQL查询能力。随着企业对数据安全和访问控制需求的增加&#xff0c;基于角色的访问控制&#xff08;Role-Based Access Control&#xff…...

DDoS 攻击下的教育网站防护策略

随着互联网的普及&#xff0c;教育网站成为学生和教师获取信息、进行在线学习的重要平台。然而&#xff0c;这些网站也成为了网络攻击的目标&#xff0c;尤其是分布式拒绝服务&#xff08;DDoS&#xff09;攻击。本文将探讨DDoS攻击对教育网站的影响&#xff0c;并提出一系列有…...

Android13以太网静态IP不保存的问题

最近在做Amlogic T982的样机&#xff0c;关于以太网部分&#xff0c;系统Settings只有一个Ethernet的条目&#xff0c;没有其他任何信息&#xff0c;什么以太网mac地址&#xff0c;开关&#xff0c;IP地址&#xff0c;子网掩码&#xff0c;默认网关&#xff0c;dns, 设置代理&a…...

Redis 7.x 系列【31】LUA 脚本

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 EVAL2.2 SCRIPT LOAD2.3 EVALSHA2.4 SCRIPT FLUSH2.5 其他 3. …...

mysql中You can’t specify target table for update in FROM clause错误

mysql中You can’t specify target table for update in FROM clause错误 You cannot update a table and select directly from the same table in a subquery. mysql官网中有这句话&#xff0c;我们不能在一个语句中先在子查询中从某张表查出一些值&#xff0c;再update这张表…...

Linux Vim最全面的教程

Vim 是一个非常强大的文本编辑器&#xff0c;它在 Linux 环境中尤其受欢迎。Vim 支持高度定制&#xff0c;并且拥有丰富的功能&#xff0c;包括多级撤销、宏、脚本语言支持等。下面是关于 Vim 的一个较为全面的教程。 Vim 的启动 要启动 Vim&#xff0c;你可以在终端中输入 v…...

setsockopt选项对tcp速度

GPT-4 (OpenAI) 每个setsockopt调用都涉及到一个套接字描述符&#xff0c;一个指定网络层的常数&#xff08;如IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6, SOL_SOCKET等&#xff09;&#xff0c;一个指定需配置的选项的常数&#xff0c;一个指向配置值的指针&#xff0c;以及那个…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

bool数组的理解和应用[C++]

文章目录 bool数组的用法bool数组的定义声明bool数组的初始化访问和修改数组元素遍历数组 运用bool数组简单代码 在今天做题中发现了bool类不仅能用于函数类型还能用于数组类型&#xff0c;好奇查了查发现bool还有很多用处&#xff1a;基本变量&#xff0c;在枚举类型中会用到&…...

JavaScript模拟滑动手势

双击回到顶部 左滑动 右滑动 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Gesture…...

Text Control 控件教程:使用 .NET C# 中的二维码和条形码增强文档

QR 码和条形码非常适合为文档和 PDF 文件增加价值&#xff0c;因为它们提供轻松的信息访问、验证信息、跟踪项目和提高交互性。条形码可以弥补纸质或数字人类可读文档与网络门户或网络应用程序中的数字信息之间的差距。大多数用户都熟悉 QR 码和条形码&#xff0c;它们在许多过…...

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…...

揭秘Django与Neo4j:构建智能知识图谱的终极指南

揭秘Django与Neo4j:构建智能知识图谱的终极指南 前言 图是一种用于对象之间的成对关系进行建模的数学结构。 它由两个主要元素组成:节点和关系。 节点:节点可以看作是传统数据库中的记录。每个节点代表一个对象或实体,例如一个人或一个地方。节点按标签分类,这有助于根…...

项目一缓存商品

文章目录 概要整体架构流程技术细节小结 概要 因为商品是经常被浏览的,所以数据库的访问量就问大大增加,造成负载过大影响性能,所以我们需要把商品缓存到redis当中,因为redis是存在内存中的,所以效率会比MySQL的快. 整体架构流程 技术细节 我们在缓存时需要保持数据的一致性所…...

SEO与数据中心代理IP的结合能带来哪些便利?

本文将探讨将SEO与数据中心代理IP结合所带来的好处&#xff0c;以及如何利用这种组合来提升网站在搜索引擎中的排名和可见性。 1. 数据中心代理IP的作用和优势 数据中心代理IP指的是由数据中心提供的IP地址&#xff0c;用于隐藏真实服务器的位置和身份。与其他类型的代理IP相…...

《昇思25天学习打卡营第6天|ResNet50图像分类》

写在前面 从本次开始&#xff0c;接触一些上层应用。 本次通过经典的模型&#xff0c;开始本次任务。这里开始学习resnet50网络模型&#xff0c;应该也会有resnet18&#xff0c;估计18的模型速度会更快一些。 resnet 通过对论文的结论进行展示&#xff0c;说明了模型的功能&…...

Activiti 6 兼容openGauss数据库bytes类型不匹配

当前有个项目需要做国产调研&#xff0c;需要适配高斯数据库&#xff0c;项目启动的时候&#xff0c;提示column "bytes_" is type bytea but expression is of type blob byte_字段是act_ge_bytearray表的&#xff0c;openGauss里的类型是bytea&#xff0c;类型是匹…...

缓存技术:提升性能与效率的利器

在当今数字化时代&#xff0c;软件应用的性能与响应速度成为了衡量其成功与否的重要标准之一。随着数据量的爆炸性增长和用户需求的日益多样化&#xff0c;如何高效地处理这些数据并快速响应用户请求成为了软件开发中亟待解决的问题。缓存技术&#xff0c;作为提升系统性能、优…...

LeetCode 637, 67, 399

文章目录 637. 二叉树的层平均值题目链接标签思路代码 67. 二进制求和题目链接标签思路代码 399. 除法求值题目链接标签思路导入value 属性find() 方法union() 方法query() 方法 代码 637. 二叉树的层平均值 题目链接 637. 二叉树的层平均值 标签 树 深度优先搜索 广度优先…...

如何压缩视频大小不改变画质?这5个视频压缩免费软件超好用!

如何压缩视频大小不改变画质&#xff1f;随着生活的水平逐步提高&#xff0c;视频流媒体服务越来越受欢迎。提供简短而引人注目的视频来展示您的产品或服务已成为一种出色的营销手段。然而&#xff0c;当您要准备导出最终视频时&#xff0c;可能会面临一个常见问题&#xff1a;…...

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…...

算法 定长按组翻转链表

一、题目 已知一个链表的头部head&#xff0c;每k个结点为一组&#xff0c;按组翻转。要求返回翻转后的头部 k是一个正整数&#xff0c;它的值小于等于链表长度。如果节点总数不是k的整数倍&#xff0c;则剩余的结点保留原来的顺序。示例如下&#xff1a; &#xff08;要求不…...

安装nfs和rpcbind设置linux服务器共享磁盘

1、安装nfs和rpcbind 1.1 检查服务器是否安装nfs和rpcbind&#xff0c;执行下命令&#xff0c;检查服务器是否安装过。 rpm -qa|grep nfs rpm -qa|grep rpcbind 说明服务器以安装了&#xff0c;如果没有就需要自己安装 2、安装nfs和rpcbind 将rpm安装包&#xff1a; libtirpc-…...

物联网在电力行业的应用

作者主页: 知孤云出岫 这里写目录标题 作者主页:物联网在电力行业的应用简介主要应用领域代码案例分析1. 智能电表数据采集和分析2. 设备监控和预测性维护3. 能耗管理和优化4. 电力负载预测5. 分布式能源管理6. 电动汽车充电管理7. 电网安全与故障检测 物联网在电力行业的应用…...