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

虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化

摘要


随着汽车以太网的兴起和车载通信系统数量的增加,网络整合成为控制复杂性和成本的关键当前架构呈现明确分层:以太网(100/1000Mbit/s)支撑信息娱乐、ADAS等高带宽应用,而CAN/CAN FD(0.5-5Mbit/s)处理发动机管理等实时控制。未来CAN XL和10BASE-T1S将瞄准中速控制领域。值得注意的是,当前约90%的车载节点通信速率仍≤10Mbit/s,凸显了中低速通信的基础性地位。

虹科PCAN XL套件

01. 深度防御

过去数十年间,IT行业始终秉持深度防御(Defense-in-Depth)核心理念,通过在信息技术系统中部署多层级独立安全控制机制,为潜在的单点失效提供冗余防护。基于这一理念,在车载10Mbit/s通信领域同步构建两种技术体系的安全防护层,已成为汽车行业应对网络整合趋势的必然要求。

本文针对多点数据层安全架构建设中的两个关键难题展开研究:其一聚焦于高效密钥协商协议的开发,其二探索桥接设备跨网络连接场景下的端到端加密实现方案。

需要特别说明的是,本文提出的安全增强方案严格遵循分层防护理念,其设计目标并非取代现有OSI协议栈中的安全机制(如车载SecOC协议、IPSec或TLS等),而是通过纵向协同构建更完备的防御体系


 

02. MACsec 和 CANsec

以太网已经有了MACsec及其配套的密钥协商协议MKA,且已定义了十年之久,而国际CiA协会正通过CiA613-2为CAN XL制定CANsec规范。MACsec和CANsec的目标都是在各自的数据层之上,以线速性能提供保密性、完整性和认证性

图1 MACsec / CANsec

为满足这些要求,这两种技术都使用具有提供认证加密和相关数据(AEAD)操作模式的分组密码。MACsec只支持AES,而CANsec则计划以 ASCON[3]的形式支持轻量级加密

受保护的帧携带一个单调递增的分组编号(PN),以防止重放攻击。这个分组编号用于生成一个随机数(Nonce),该随机数是相应AEAD算法所需的输入。

那么有了这些基石,就不可能在网络的整个生命周期中使用永久有效的加密密钥,因为使用相同密钥意味着重复使用随机数,这样实际上会使加密无效。

因此,需要一种机制来协商一个临时有效的会话密钥,或者根据MKA规范称为安全关联密钥(SAK),并定期更换该密钥。

03. 10Mbit/s速率领域的MKA

以太网拥有经过充分验证、功能丰富但也相当复杂的MACsec密钥协议,专门用于解决这一难题,因此,选择MKA作为CANsec(CAN XL)和MACsec(10BASE- T1S)的密钥协议解决方案也是很自然的。

MKA是围绕零知识和零假设方法设计的,每个参与者只依赖自己的实施质量。由于MKA使用专用的MACsec密钥协议数据单元 (MKPDU),它不需要知道有多少参与者正在、将要或曾经在线,也不要求参与者以一定的频率发送数据。此外,每个参与者在启动时生成的随机成员标识符确保了重放保护。如果相关参与者的随机数生成器质量较高,则该参与者可以安全地抵御MKA控制信息的重放攻击。

不过,典型的MKA应用与在10Mbit/s速率领域的预期应用之间存在两个决定性差异

首先,虽然MACsec密钥协商是为任意数量的参与者(或根据IEEE 802.1标准称为对等节点)制定的,但实际使用中很少超过两个参与者。

其次,MKA的Hello时间为两秒。因此,建立密钥协商至少需要两秒,平均需要三秒。

虽然这种密钥协议时间在数据中心等典型的以太网环境中是可以接受的,但在汽车或其他对时间更敏感的环境中就不行了。对于增加一个安全层所造成的通信延迟具体有多少是可以接受的,目前还没有达成共识。观点有从几毫秒到一百多毫秒不等。这完全取决于具体的使用情况,但对于大多数(汽车)使用情况来说,MKA所需的平均3秒钟太慢了

04. 更快的MKA

以下优化措施的目标都是在不违反现有规范[2]的情况下,缩短密钥协商时间(即从所有参与者上线到所有参与者能够相互通信的时间间隔)。因此,MKPDU,尤其是其中包含的所有参数集都不会以任何方式进行修改,也不会违反IEEE规范中的任何「应」和「可」规则。

2021年,Völker博士[1]提出了一些修改建议,以优化密钥协商时间。其基本思路是:根据MKPDU的内容对其进行分类,并相应地修改发送频率

最直观的,你能想到的规则是,每当有有助于达成密钥协议的消息要发送时,每个参与者都要发送一个更新的MKPDU。这些规则是:

(1) 潜在对等节点或活动对等节点列表发生了变化

(2) 需要分发新的安全关联密钥

(3) 已安装新的安全关联密钥,需要进行确认

(4) 新参与者想要加入连接关联

我们将这组规则称为基本配置文件。

如文献[1]所示,这些修改产生了显著效果,将密钥协议所需的时间减少到了30毫秒以下

05. 多节点应用场景

让我们将这些修改应用于MKA,将参与者数量扩展到n,并从理论上分析需要交换多少消息,以及每个参与者必须处理多少消息。

如果所有参与者同时上线,每个参与者都会生成一个MKA Hello消息,其中包含其随机生成的成员标识符。每个参与者都会收到n-1条这样的消息,每次处理一条,就向其潜在对等节点列表中添加n-1个条目,并回复n-1次。那么总共会发送n²条消息,每个参与者必须处理n²-n条消息。因此,密钥协商的这一初始步骤与参与者数量并非呈线性关系

图2 基本资料——参与方发现

如果我们将规则稍作修改,这个问题就可以得到解决:

(1) 在潜在对等节点或活动对等节点列表中添加一个密钥服务器对等节点。

我们将这组修改后的规则称为优化配置文件。在典型设置中,通常只有一两个具备密钥服务器功能的参与者。

这使得每个参与者必须处理的消息数量减少到O(n)。

图3 优化配置文件——参与方发现

在密钥分发过程中也能观察到类似的现象。根据MKA规范,如果有参与者添加到活动对等节点列表中,密钥服务器应分发新的SAK。

在我们的系统启动场景中,密钥服务器在收到第一个MKA Hello响应时会发出一个新的SAK,收到第二个响应时再发出一个,如此继续,直到活动对等节点列表最终包含所有参与者的成员标识符。总共会分发n-1个SAK,但只有最后一个会得到所有参与者的确认。不幸的是,所有SAK都会被其MKA Hello消息最先被密钥服务器处理的参与者确认,除第一个SAK外,其他SAK都会被其MKA Hello消息第二个被处理的参与者确认,如此继续,直到最后分发的SAK最终被所有参与者接受和确认。为了完成密钥协商,每个参与者总共必须处理O(n²) 数量的消息。

图4 基本配置文件——密钥分发

为了解决这个问题,必须减少密钥服务器分发的密钥分发消息数量。一种实现方法是让密钥服务器知道参与者的数量。有了这个信息,密钥服务器可以有意延迟SAK的分发,直到收到所有预期参与者的MKA Hello消息。但这需要完全静态的网络设置,因此并不适用于所有用例。例如,若有一个参与者的启动速度明显慢于其他参与者,就会导致网络中的其他部分无法通信。

另一种保持MKA对网络拓扑无感知特性的方法是限制新SAK的发布。密钥服务器在处理完一个传入的MKPDU后,会进入一个需要发布新SAK的状态。此时,它不是立即发送相应的MKPDU,而是将发送延迟一定时间。这使密钥服务器有时间处理其他传入的MKA Hello消息(见图5),并发布一个可供更多甚至所有参与者使用的SAK。让我们将这种行为添加到优化配置文件中。

图5 优化后的剖面图

在对16个参与者进行的模拟中,这种优化将分发的SAK数量减少到两个,从而消除了运行时间随参与者数量呈二次方增长的问题。这种方法具有很大的灵活性。根据网络设置,你可以选择合适的延迟时间来优化密钥协商时间。

例如:

(1) 所有参与者速度相同。你可以将延迟时间设置为一个较小的值,但要足够让密钥服务器处理所有MKA Hello响应。

(2) 有一个参与者比其他参与者慢得多,但它提供了重要信息。你可以将延迟时间设置为能让这个慢的参与者有足够时间发送其MKA Hello响应的值。

更有利的是,如果连接的参与者不提供此选项,或者你无法访问其配置,那么只需对密钥服务器应用此配置即可。

06. MKA的替代方案

密钥协商协议的选择取决于对密钥协商的具体要求,以及协议名称所隐含的特性。如果你的保护目标是使密钥协商不会受到来自孤立参与者的有效记录流量的攻击,那么密钥协商协议需要包含一些挑战响应协议部分,强制加入一个潜在攻击者无法控制且质量良好(尽可能随机)的值(即挑战)。

有两种方法可以实现这一点。第一种方法需要一个高度同步的公共时间源,这本身就是一个难题,本文不对此进行讨论。第二种方法要求每个参与者生成一个随机数,并将其发送给所有其他参与者,而其他参与者则必须在响应中包含所有这些随机数(在MKA中称为成员标识符)。

这正是MKA所采用的方式。任何替代方案都必须采取类似的做法,并且不可避免地至少需要一个消息往返,因此会涉及传输和处理时间。如果没有设置时间,就无法实现能够抵御这种重放攻击的密钥协商。

07. 小结

仿真结果清楚地表明,MKA可以优化到在典型网络设置中,最多16个参与者的密钥协商能够在50毫秒内完成。与标准MKA相比,这是一个巨大的改进,因为我们只是对时间进行了更精确的调整,并分析了关键因素。

这种优化方法保留了MKA的所有优点(功能丰富、经过充分验证、与网络无关),使其适用于许多需要更快通信启动时间的用例。

08. 桥接场景中的端到端 CANsec

在某些用例中,桥接设备是两个或更多CAN XL网络的一部分,用于实现消息在CAN总线A和CAN总线B之间的转发。

图6 桥接的CAN XL网络

可能会出现这样的情况:CAN总线A上的消息的优先级标识符已被CAN总线B中的CAN XL节点使用,因此如果不进行修改就转发消息,会导致优先级标识符冲突。

如果你想使用CANsec保护这样的系统,可以为总线A和总线B分别建立不同的连接关联。桥接设备对传入的消息进行解密,根据需要修改优先级标识符,然后重新加密消息。考虑到深度防御原则,这可能不是最佳选择,因为这意味着桥接设备必须拥有两个关联的长期密钥,这使其成为攻击者的主要目标。

从安全角度来看,端到端加密更为理想,即桥接设备不进行加密操作,因此无需访问任何密钥。为了在CANsec中实现这种场景,当前的CiA 613-2草案规定了一些选项,可以将优先级标识符和虚拟CAN标识符(VCID)排除在CANsec提供的完整性保护之外。

虽然这些选项确实使实现此类场景成为可能,但请确保你极其谨慎地使用它们,因为优先级标识符和VCID都不能包含语义信息,这一点至关重要。

09. 切勿将优先级标识符用作标识符

CAN XL相较于传统CAN和CAN FD的改进之一,是它打破了标识符字段在语义上不太合理的双重用途。在CAN XL出现之前,标识符字段既是物理层的优先级指令,又是消息标识符。因此,在不改变消息含义的情况下,无法更改标识符字段。而在CAN XL中,优先级指令由优先级标识符承担,接受字段(AF)负责识别消息的含义

在理想情况下,设计CAN XL网络的系统工程师会牢记这一点,不会混淆这两个字段的独立用途。在这种情况下,CANsec的排除选项支持端到端加密的桥接。但是,如果至少有一个CAN XL节点只是对现有CAN FD实现的简单迁移,会发生什么情况呢?

很可能优先级标识符只是遗留项目中的CAN标识符,因为这是将项目迁移到CAN XL的最简单方法。这样一来,优先级标识符的含义超出了预期,在不失去CANsec保护的情况下,无法桥接CAN XL消息。

遗憾的是,当前的CANsec草案并未针对这种情况提供安全的解决方案。

CANsec排除选项的另一个缺点是,网络中的所有节点都必须预先配置,以表明某些消息要进行转发,并因此将优先级标识符从其完整性校验值(ICV)计算中排除。如果不更改配置,就无法通过桥接设备连接第二条CAN总线,而这可能由于无法访问所有节点而无法实现,这限制了扩展选项。

10. CAN-in-CAN

如果遇到优先级标识符传达语义信息的情况,并且/或者希望能够灵活地选择或临时添加桥接设备,就需要一种满足以下要求的解决方案:

(1)  节点无需知道其消息是否会跨越其 CAN XL 网络的边界。

(2)  CAN XL 报头的所有字段都受到 CANsec 的保护

CAN-in-CAN就是一种满足上述要求且不会破坏端到端加密的解决方案

发起方网络的配置保持不变,因此每个节点都传输CANsec保护的帧。桥接设备识别要转发的帧,并将整个CAN XL帧(包括其报头数据)作为新「封装」帧的有效载荷,并为其添加一个新的CAN XL报头。图9展示了这一概念。

图9 CAN-in-CAN

接收网络中的节点通过特殊的服务数据类型识别转发的帧,移除目标网络报头,然后可以验证未修改的CANsec保护帧。如果不使帧无效,就无法篡改其任何内容(包括优先级标识符和 VCID)。

图10 通信示例

由于MKA控制消息也必须以相同方式通过桥接设备,因此所有参与节点都必须支持CAN-in-CAN概念。

总结.

虽然CAN-in-CAN概念在CAN XL有效载荷中需要额外占用12个字节,但它提供了更大的灵活性,并为使用遗留组件安全桥接 CAN XL 网络提供了可能。


文章来源

本文基于Peter Decker(Vector)在第18届国际CAN大会(iCC)的演讲。已刊于《第18届iCC会议论文集》2024版,由CiA出版。虹科智能互联团队翻译并分享,旨在与行业同仁共享前沿技术成果。

参考文献

[1]  Starting Up MACsec for Automotive Ethernet, Dr. Lars Völker

[2]  IEEE802.1X-2020

[3]  Ascon - Lightweight Authenticated Encryption & Hashing​​​​

相关文章:

虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化

摘要 随着汽车以太网的兴起和车载通信系统数量的增加,网络整合成为控制复杂性和成本的关键。当前架构呈现明确分层:以太网(100/1000Mbit/s)支撑信息娱乐、ADAS等高带宽应用,而CAN/CAN FD(0.5-5Mbit/s&#…...

Linux干货(一)

前言 从B站黑马程序员Linux课程摘选的学习干货,新手友好!若有侵权,会第一时间处理。 1.Linux目录结构 1.Linux操作系统的目录结构 Windows系统可以拥有多个盘符,如C盘、D盘、E盘 Linux没有盘符这个概念,只有一个根…...

Scala和Go差异

Scala和Go(又称Golang)是两种现代编程语言,各自具有独特的特性和设计哲学。 尽管它们都可以用于构建高性能、可扩展的应用程序,但在许多方面存在显著差异。 Scala和Go的详细比较,涵盖它们的异同点: 1. 语…...

PNG图片转icon图标Python脚本(简易版) - 随笔

摘要 在网站开发或应用程序设计中,常需将高品质PNG图像转换为ICO格式图标。本文提供一份高效Python解决方案,利用Pillow库实现透明背景完美保留的格式转换。 源码示例 from PIL import Imagedef convert_png_to_ico(png_path, ico_path, size):"…...

C语言中的宏

1.防止头文件重复包含 1.#pragma once #pragma once 是一个编译器指令,用于防止头文件被重复包含。它的核心作用是通过简单语法替代传统的头文件保护宏(#ifndef/#define/#endif),提升代码简洁性和可维护性。 作用详解 防止重复…...

飞拍技术介绍

运动控制探针功能详细介绍 运动控制探针功能详细介绍(CODESYS+SV63N伺服)_伺服探针功能-CSDN博客文章浏览阅读683次。文章浏览阅读1.2k次。本文详细介绍了如何使用汇川AM400PLC通过EtherCAT总线与禾川X3E伺服进行通信。包括XML硬件描述文件的下载与安装,EtherCAT总线的启用…...

Qt进阶开发:QTcpSocket的详解

文章目录 一、QTcpSocket 简介二、常用方法的介绍和使用三、常用的信号函数一、QTcpSocket 简介 QTcpSocket 是 Qt 网络模块中用于实现基于 TCP 协议的客户端通信的类。它提供了一个面向流的接口,允许程序通过套接字连接到远程主机,发送和接收数据。 所属模块:QtNetwork用于…...

React中的状态管理Dva总结

在 React 开发中,随着应用的复杂度增加,如何高效地管理应用状态成为了一个非常重要的问题。为了解决这一问题,很多开发者选择了 Redux,然而 Redux 的学习曲线较陡,且需要配置较多的样板代码。为此,Ant Desi…...

PyTorch中的nn.Embedding应用详解

PyTorch 文章目录 PyTorch前言一、nn.Embedding的基本原理二、nn.Embedding的实际应用简单的例子自然语言处理任务 前言 在深度学习中,词嵌入(Word Embedding)是一种常见的技术,用于将离散的词汇或符号映射到连续的向量空间。这种…...

Python Django基于模板的药品名称识别系统【附源码、文档说明】

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

深度学习---获取模型中间层输出的意义

一、什么是 Hook(钩子函数)? 在 PyTorch 中,Hook 是一种机制,允许我们在模型的前向传播或反向传播过程中,插入自定义的函数,用来观察或修改中间数据。 最常用的 hook 是 forward hook&#xf…...

【软件测试】第一章·软件测试概述

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件测试与软件项目管理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录…...

格雷希尔G10和G15系列自动化快速密封连接器,适用于哪些管件的密封,以及它们相关的特性有哪些?

格雷希尔G10和G15系列快速密封连接器,用于自动化和半自动化过程中的外部或内部密封,通过使用气压驱动来挤压内部的密封圈,创造一个适用于各种管件的无泄漏密封连接,连接器内部的弹性密封圈可以提供其他产品不能提供的卓越密封性能…...

从零实现一个高并发内存池 - 1

C 高性能内存池解析 在 C 开发中,内存管理一直是影响程序性能的关键因素之一。传统的内存分配方式如 malloc 和 free 在高并发场景下往往存在性能瓶颈。为了解决这一问题,很多优秀的内存池方案应运而生,其中 Google 的 tcmalloc(T…...

在 STM32 上使用 register 关键字

在 STM32 上使用 register 关键字时,有一些特别需要注意的事项。虽然 register 是 C 语言中的一个标准关键字,它用于提示编译器将变量尽可能存放在寄存器中,以加速访问,但在 STM32 这样的嵌入式平台上,还是需要考虑几个…...

【入门】纸盒的最大体积是多少?

描述 在一张尺寸为 n * n 厘米的正方形硬纸板的四个角上,分别裁剪掉一个 m * m 厘米的小正方形,就可以做成一个无盖纸盒,请问这个无盖纸盒的最大体积是多少? 立方体的体积 v 底面积 * 高) 比如: n 5 &am…...

漏桶算法的实际应用案例:数据库批量写入流量控制

场景描述 假设有一个物联网平台,需要实时接收成千上万台设备上报的数据(如温度、湿度等),并将数据存入数据库。设备可能在某些时刻集中发送数据(例如定时批量上报),直接写入数据库可能导致以下问…...

c++函数参数列表后面的const的作用(常量成员函数)

c函数参数列表后面的const的作用 class Person { public://普通构造函数Person():age(0){}//常量成员函数void read_age() const {age100; //错误&#xff01;常量成员函数不允许修改成员变量&#xff08;除非成员变量用mutable修饰&#xff09;std::cout << "age:…...

Java的While循环写的出票简单程序

import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int balance 0;while(true){System.out.print("请投币: ");int amount in.nextInt();balance balance amount;if(balance >10 )…...

时间序列基础【学习记录】

文章目录 1. 时间序列中的标签2. 时间序列中的窗口分割器2.1.概述2.2.窗口分割器demo 3. 时间序列的数据加载器3.1.概述3.2.时间序列的dataset3.3.Tensor类型3.4.测试完整流程demo 1. 时间序列中的标签 在目标检测领域的数据集中的图像会有一个标签**(标记一个物体是猫还是狗或…...

Andorid之TabLayout+ViewPager

文章目录 前言一、效果图二、使用步骤1.主xml布局2.activity代码3.MyTaskFragment代码4.MyTaskFragment的xml布局5.Adapter代码6.item布局 总结 前言 TabLayoutViewPager功能需求已经是常见功能了&#xff0c;我就不多解释了&#xff0c;需要的自取。 一、效果图 二、使用步骤…...

光谱相机的光电信号转换

光谱相机的光电信号转换是将分光后的光学信息转化为可处理的数字信号的核心环节&#xff0c;具体分为以下关键步骤&#xff1a; 一、分光后光信号接收与光电转换 ‌分光元件作用‌ 光栅/棱镜/滤光片等分光元件将入射光分解为不同波长单色光&#xff0c;投射至探测器阵列表面…...

MySQL历史版本下载及安装配置教程

1、访问官网下载mysql https://dev.mysql.com/downloads/mysql/ 2、找到历史版本 我这里的版本是最新的mysql8.0.42 下载完成之后,将压缩包进行解压 3、环境变量 在系统变量中找到Path,点击进入编辑&#xff0c;然后依次点击确定退出即可 注意&#xff01;&#xff01;&am…...

【ArcGIS】根据shp范围生成系列等距点:范围外等距点+渔网点(Python全代码)

【ArcGIS】根据shp范围生成系列等距点 目标1&#xff1a;生成边界外一定范围、并且等间距分布的点&#x1f4c1; 所需数据&#xff1a;操作步骤-ArcGIS代码处理-Python 目标2&#xff1a;生成等距渔网点&#x1f4c1; 所需数据&#xff1a;代码处理-Python 参考 目标1&#xff…...

基于FPGA的视频接口之千兆网口(六GigE纯逻辑)

协议简介 相信大家只有对于GigE有所了解的读者,才能找到这篇文章,所谓的GigE协议包含两个方面分别是视频协议(GVSP)和控制协议(GVCP)。 在本文我们重点讲的是基于FPGA纯逻辑实现阉割版的GigE协议,也就是说在很多视频传输过中,只用到了视频流传输,并没有控制方面的要求…...

android 权限配置

在AOSP 14的ROM定制中&#xff0c;<exceptions>和<privapp-permissions>是用于管理特权应用权限的两种不同机制&#xff0c;主要区别在于作用范围、配置方式和权限授予逻辑。以下是具体分析&#xff1a; 1. <privapp-permissions> 标签 作用&#xff1a; 用…...

广告推荐算法入门 day1 --项目选型

文章目录 0 前言1 广告推荐的基本流程2 场景和baseline初步框定2.1召回场景2.2排场景2.3精排场景 3 一个入门小例子感受--淘宝用户购物行为数据可视化分析3.1 数据集介绍3.2 数据分析目标1.时间维度2.产品维度3.行为维度4.用户维度 4 基础项目选型4.1场景 推荐资料后记 0 前言 …...

【Qt】之音视频编程2:QtAV的使用篇

QtAV 基本播放控制功能实现&#xff08;C & QML&#xff09; QtAV 提供了完整的播放控制 API&#xff0c;支持 播放、暂停、停止、快进快退、截屏 等功能。以下是具体实现方法&#xff1a; 1. C 控制方式 基本播放控制 #include <QtAV> #include <QtAV/AVPlaye…...

技术视角下的TikTok店铺运营:从0到1的5个关键点

在当今数字化时代&#xff0c;TikTok Shop作为新兴的电商平台&#xff0c;为众多商家带来了新的机遇。从技术运营的角度来看&#xff0c;以下5个关键点是每个TikTok店铺运营者都需要注意的&#xff1a; 1、规则先行&#xff0c;技术助力合规开店 地区选择&#xff1a;技术分析显…...

机器学习 --- 特征工程(一)

机器学习 — 特征工程&#xff08;一&#xff09; 文章目录 机器学习 --- 特征工程&#xff08;一&#xff09;一&#xff0c;特征工程概念二&#xff0c;特征工程API三&#xff0c;DictVectorizer 字典列表特征提取四&#xff0c;CountVectorizer 文本特征提取4.1 API4.2 英文…...

cocos creator 3.8 下的 2D 改动

在B站找到的系统性cocos视频教程,纯2D开发入门,链接如下: zzehz黑马程序员6天实战游戏开发微信小程序&#xff08;Cocos2d的升级版 CocosCreator JavaScript&#xff09;_哔哩哔哩_bilibili黑马程序员6天实战游戏开发微信小程序&#xff08;Cocos2d的升级版 CocosCreator Ja…...

2025-05-13 表征学习

表征学习 表征学习&#xff08;Representation Learning&#xff09;&#xff0c;又称特征学习&#xff0c;是机器学习领域中的一类技术&#xff0c;旨在自动的从原始数据中学习处有效的特征表示&#xff0c;使得后续的机器学习任务&#xff08;分类、聚类、预测&#xff09;能…...

【WebApi】YiFeiWebApi接口安装说明

YiFeiWebApi接口安装说明 一、 数据库配置文件修改二、 IIS环境配置(建议IIS7.0)三、 安装.NET 8.0 运行时四、 IIS配置站点五、 发布系统六、 测试接口七、测试服务器站点接口八、其他问题查看日志解决九、ApiPost项目文档 一、 数据库配置文件修改 说明&#xff1a; DSCSYSSq…...

亚马逊云科技:开启数字化转型的无限可能

在数字技术蓬勃发展的今天&#xff0c;云计算早已突破单纯技术工具的范畴&#xff0c;成为驱动企业创新、引领行业变革的核心力量。亚马逊云科技凭借前瞻性的战略布局与持续的技术深耕&#xff0c;在全球云计算领域树立起行业标杆&#xff0c;为企业和个人用户提供全方位、高品…...

爬虫请求频率应控制在多少合适?

爬虫请求频率的控制是一个非常重要的问题&#xff0c;它不仅关系到爬虫的效率&#xff0c;还涉及到对目标网站服务器的影响以及避免被封禁的风险。合理的请求频率需要根据多个因素来综合考虑&#xff0c;以下是一些具体的指导原则和建议&#xff1a; 一、目标网站的政策 查看网…...

Rimworld Mod教程 武器Weapon篇 近战章 第二讲:生物可用的近战来源

本讲分析的是在原版&#xff08;coreall dlc&#xff09;环境下&#xff0c;一个Pawn可以用的Tools的所有来源。 重点要分析的是RimWorld.Pawn_MeleeVerbs下的方法GetUpdatedAvailableVerbsList&#xff0c;我把它贴在下面&#xff1a; public List<VerbEntry> GetUpdat…...

SAP汽配解决方案:无锡哲讯科技助力企业数字化转型

汽配行业面临的挑战与机遇 随着汽车行业的快速发展&#xff0c;汽配企业面临着激烈的市场竞争、供应链复杂化、成本压力增大等多重挑战。传统的管理模式已难以满足现代汽配企业对高效生产、精准库存、快速响应的需求。在此背景下&#xff0c;数字化转型成为汽配企业的必然选…...

day19-线性表(顺序表)(链表I)

一、补充 安装软件命令&#xff1a; sudo apt-get install (软件名) 安装格式化对齐&#xff1a;sudo apt-get install clang-format内存泄漏检测工具&#xff1a; sudo apt-get install valgrind 编译后&#xff0c;使用命令 valgrind ./a.out 即可看内存是…...

里氏替换原则:Java 面向对象设计的基石法则

一、原则起源与核心定义 20 世纪 80 年代&#xff0c;计算机科学家芭芭拉・里氏&#xff08;Barbara Liskov&#xff09;在一篇论文中首次提出了里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;&#xff0c;这成为面向对象设计的重要理论基…...

GBK与UTF-8编码问题(2)

1. 问题现象 在python代码中&#xff0c;用open函数打开文本文件并显示文本内容&#xff0c;中文显示乱码&#xff0c;代码如下。 from tkinter import * import tkinter.filedialogroot Tk() # 给窗口的可视化起名字 root.title(Open File Test)# 设定窗口的大小(长 * 宽) r…...

项目三 - 任务6:回文日期判断

本任务通过判断回文日期&#xff0c;深入学习了Java中日期和字符串处理的相关知识。通过输入年、月、日&#xff0c;生成8位日期字符串&#xff0c;利用StringBuffer的reverse()方法反转字符串&#xff0c;比较原字符串与反转后的字符串是否一致&#xff0c;从而判断是否为回文…...

从零开始掌握FreeRTOS(1)移植到STM32

目录 提前准备 源码文件移植 修改 stm32f10x_it.c 修改 FreeRTOS.h 本章思维导图。 提前准备 学习 FreeRTOS 的第一步就是有一份最工程能够跑在 STM32 上。本篇将记录本人从0搭建一个最基础的移植工程Demo。 要完成这份 Demo&#xff0c;首先我们需要预先准备以下东西&…...

esp32硬件支持AT指令

步骤1&#xff1a;下载AT固件 从乐鑫官网或Git鑫GitHub仓库&#xff08;https://github.com/espressif/esp-at&#xff09;获取对应ESP32型号的AT固件&#xff08;如ESP32-AT.bin&#xff09;。 步骤2&#xff1a;安装烧录工具 使用 esptool.py&#xff08;命令行工具&#…...

【神经网络与深度学习】局部最小值和全局最小值

引言 在机器学习和优化问题中&#xff0c;目标函数的优化通常是核心任务。优化过程可能会产生局部最小值或全局最小值&#xff0c;而如何区分它们并选择合适的优化策略&#xff0c;将直接影响模型的性能和稳定性。 在深度学习等复杂优化问题中&#xff0c;寻找全局最小值往往…...

部署安装git-2.49.0.tar.xz

实验环境 git主机&#xff1a;8.10 所需软件 git-2.49.0.tar.xz 实验开始 实验目的&#xff1a;安装升级git2.49.0 编译安装 yum remove git -y --卸载旧版git cd /usr/local/src/ wget https://www.kernel.org/pub/software/scm/git/git-2.49.0.tar.xz …...

SpringBoot的单体和分布式的任务架构

在Spring Boot生态中&#xff0c;定时任务框架的选择需根据架构类型&#xff08;单体或分布式&#xff09;和功能需求进行权衡。以下从框架特性、适用场景及Spring Boot集成方式等角度&#xff0c;详细梳理主流的定时任务框架及其分类&#xff1a; 一、单体架构下的定时任务框架…...

第四章 部件篇之按钮矩阵部件

第四章 部件篇之按钮矩阵部件 在 LVGL中&#xff0c; 按钮矩阵部件相当于一系列伪按钮的集合&#xff0c;它按一定的序列来排布这些按钮。值得注意的是&#xff0c;这些伪按钮并不是真正的按钮部件&#xff08;lv_btn&#xff09; &#xff0c; 它们只是具有按钮外观的图形&…...

二分查找算法的思路

二分查找思路总结 明确目标与单调性特点&#xff1a; 核心目标&#xff1a;寻找满足某种条件的答案&#xff08;如最小/最大值&#xff09;。单调性要求&#xff1a;需要证明你的判断函数具有单调性——即如果某个答案 T 可行&#xff0c;那么大于 T 的答案通常也是可行的&…...

Shell脚本与Xshell的使用、知识点、区别及原理

Shell脚本与Xshell的使用、知识点、区别及原理 Shell脚本 基本概念 Shell脚本是一种为Shell编写的脚本程序&#xff0c;通常用于自动化执行一系列命令。它是在Unix/Linux系统下的命令行解释器与用户交互的接口。 主要知识点 脚本结构&#xff1a;以#!/bin/bash开头&#xf…...

【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现

1 限流的重要性 在高并发系统中&#xff0c;保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据&#xff0c;减少对数据库的访问&#xff0c;提升系统响应速度&#xff0c;如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…...