【机密计算】机密计算通用框架解读
创始人
2024-06-02 19:18:52
0

2019年8月22日,Linux基金会宣布多家巨头企业组建“机密计算联盟”(Confidential Computing Consortium),该基金将负责对联盟活动进行监督。机密计算联盟专门针对云服务及硬件生态,致力于保护计算数据安全。联盟创始成员包括阿里巴巴、Arm、百度、谷歌云、IBM、英特尔、微软、红帽、瑞士通和腾讯,不包括全球最大的云服务器运营商亚马逊。

机密计算联盟致力于解决人们对于数据隐私的担忧问题,寻求基于硬件和软件的技术解决方案,用以在处理计算机内存时隔离用户数据。通过机密计算方案,敏感数据能免于被暴露给其他应用程序、操作系统或者服务器租用者。

概述


机密计算

一种在受信任的硬件基础上,结合固件和软件构建加密、隔离、可验证的计算环境,保证环境内数据机密性、完整性,代码完整性以及运算过程机密性的计算模式。

注:运算过程是指程序运行过程,在该过程中会产生进程程序段、数据段、进程控制块以及进程通信涉及的所有数据。

角色

在机密计算典型交互活动中,所涉及的主要角色包括

  • 计算程序提供方;
  • 机密计算服务提供方
  • 机密计算平台提供方
  • 数据提供方;
  • 结果需求方。

如图1所示,上述角色不限定为不同实体,即同一实体可以担任多种角色。

图1 机密计算典型交互方关系图

主要参与角色描述如下:

a) 计算程序提供方:负责提供需要在机密计算环境中运行的计算程序,计算程序应和结果需求方的计算需求描述相符。

b) 机密计算服务提供方:负责为结果需求方提供机密计算服务的软件模块,服务提供方也提供服务的管理功能,如支持计算程序的录入与发布。

c) 机密计算平台提供方:负责提供机密计算环境所依赖的可信软硬件以及服务提供方所使用的接口,包括集成在机密计算平台内部的信任根、可信执行环境等,建立实现完整的度量存储报告机制,将信任链扩展到计算程序。

d) 数据提供方:负责提供计算任务所使用的计算数据,计算数据在计算过程中应保证机密性和完整性。

e) 结果需求方:负责提供具体的计算需求描述给机密计算服务或者直接使用机密计算平台执行计算需求,包括需要运行的程序、程序运行时需要计算的数据等,并获得相应的机密计算结果。

信任条件

各个角色在参与机密计算的计算任务时,可以通过以下操作建立信任关系
a)程序提供方验证机密计算服务的计算环境完整性和真实性,确保录入的计算程序被运行在可信
执行环境
内。计算程序方【需要】可信的计算环境,保证自身完整性

b)数据提供方验证计算环境完整性和真实性且需要验证程序代码完整性,确保程序代码与计算需
求描述相符。数据提供方可以将数据以密文形式输入给机密计算服务,确保只有对应的计算程序在可信执行环境中可以读取。数据提供方【需要】可信执行环境、正确的计算程序以及机密计算服务。
c)结果需求方验证计算环境完整性、真实性和程序代码完整性,确保计算的执行程序与计算需求
描述一致。结果需要方不需要对输入数据进行保证。

框架组成

框架描述

本文件所定义的机密计算通用框架如图2所示,主要分为硬件层、系统软件层、服务层、应用层和管理层五个层次。

  • 硬件层基于硬件隔离实现受保护的资源不被开放系统访问,并提供基于硬件安全功能为机密计算提供受信任的硬件基础
  • 系统软件层为机密计算提供基于软件的隔离机制、必要的硬件资源和基础服务
  • 服务层为上层应用程序提供统一的编程接口及机密计算服务接口,以屏蔽底层硬件架构和软件的开发接口差异。安全隔离、安全启动、远程证明、安全通道、密钥派生、安全存储、密码运算、数据封装。
  • 应用层是直接面向结果需求方的应用程序,结果需求方通过应用程序执行计算操作。
  • 管理层通过跨层交互为开展机密计算活动提供必要的管理模块。密钥管理、日志管理、资源管理、白名单管理。
图2 机密计算通用框架

机密计算参与角色和通用框架的对应关系如图3所示。

图3 机密计算参与角色和通用框架的对应关系

硬件层

核心组件

机密计算框架硬件层核心组件主要包括:

  • a) 可信执行控制单元:在CPU上定义安全加强的指令控制逻辑,以实现指令隔离执行的目标,常见在缓存控制器、DMA控制器、中断控制器中加强,也有独立的控制单元
  • b) 隔离内存空间:通过CPU可信执行控制单元隔离出的内存空间,独立于通用内存空间;
  • c) 可信固件:提供识别硬件设备初始化信息、支持系统软件的完整性校验、升级维护以及配置机密计算环境资源等功能;
  • d) 硬件密码引擎:硬件密码引擎使用设备唯一密钥以及真随机数生成器,为机密计算应用程序提供密钥派生能力;
  • e) 设备唯一密钥:在硬件中固化的一个唯一标识,设备制造阶段写入,设备唯一密钥由于具备唯一性,作为根密钥用于派生在机密计算环境中使用的加密密钥;
  • f) 随机数生成器:在密钥生成和密码运算过程,生成真随机数,可以抗重放攻击;
  • g) 信任根:用于支撑机密计算环境自下而上信任链的建立,并提供安全存储、完整性度量、身份认证等安全功能。

基础功能

机密计算框架硬件层具备的基础功能包括但不限于:

  • a) 提供内存隔离机制,普通计算环境无法访问机密计算环境的内存数据;
  • b) 提供基于物理可信根的安全启动机制,对机密计算环境中的关键固件和关键系统软件进行完整性校验,校验通过方可加载和运行;
  • c) 提供基于硬件的密钥派生机制,保护被派生密钥的机密性;
  • d) 提供对普通计算环境和机密计算环境的通信指令调度机制;
  • e) 可以灵活设置分配给机密计算环境的内存空间大小。

系统软件层

核心组件

机密计算框架系统软件层核心组件主要包括:

a) 机密计算操作系统:基于底层CPU的可信执行控制单元和指令集封装裁剪的操作系统,主要提供基于TEE资源的计算资源调度、隔离内存空间管理以及和普通计算环境的通信机制等功能;

注:该组件可作为可选组件

b) 机密计算虚拟化软件:部署在机密计算环境中的虚拟化软件,为机密VM或容器的部署提供支撑。

注:该组件可作为可选组件。 

基础功能

机密计算框架系统软件层具备的基础功能包括但不限于:

a) 保障系统软件的隔离性,普通计算环境不能越权访问机密计算操作系统;

b) 提供多线程、多进程的计算能力;

c) 对机密计算应用程序进行完整性和真实性校验,验证通过后方可运行;

d) 使用符合国家密码管理部门相关要求的密码算法

e) 具备适配C、C++、Python、JAVA等主流编程语言的能力。

服务层

核心组件

机密计算框架服务层核心组件主要包括:

机密计算统一服务平台:

通过提供统一的编程接口,为应用程序提供与具体硬件架构解耦的统一机密计算安全机制,包括安全隔离、安全启动、远程证明、安全通道、密钥派生、安全存储、密码运算、数据封装,降低不同架构的开发与部署成本。该平台部署在系统软件层之上,应用层之下。

基础功能

机密计算框架服务层具备的基础功能包括但不限于:

a) 提供应用程序集成开发接口和代码生成工具,提高开发机密计算应用程序的易用性

b) 为服务提供方或结果需求方提供机密计算必要的安全机制

c) 兼容不同的TEE硬件架构

d) 兼容多种密码算法并保证密码算法的可用性。

应用层

核心组件

机密计算框架应用层核心组件主要包括:

机密计算应用程序:在机密计算操作系统之上运行的应用程序,涉及敏感数据的处理逻辑都需要在机密计算应用程序中完成。

基础功能

机密计算框架应用层具备的基础功能包括但不限于:

a) 未经授权的应用程序不能查看正在机密计算环境中运行的代码和数据;

b) 未经授权的应用程序不能在机密计算环境内部添加、删除或更改运行的代码和数据;

c) 保障不同机密计算应用程序之间的隔离性

管理层

核心组件

机密计算框架管理层核心组件主要包括:

a) 密钥管理:对执行机密计算操作所涉及的密钥进行管理,包括密钥生成、保护、传输、销毁等;

b) 日志管理:对执行机密计算操作进行记录,提供日志回溯功能,并能保证日志的完整性;

c) 白名单管理:提供机密计算所涉及的固件版本、驱动程序、设备身份可信的清单;

d) 资源管理:对执行机密计算操作所需的CPU计算资源、内存资源等进行管理。

基础功能

机密计算框架管理层具备的基础功能包括但不限于:

a) 通过底层硬件保证密钥的机密性、不可篡改性和不可否认性

b) 用于执行机密计算任务的密钥在机密计算环境内生成

c) 确保机密计算环境内的加密密钥、签名密钥等密钥具有明确、单一的用途

d) 对硬件资源状态、系统运行状态、接口适配情况、机密计算任务状态、网络状况等状态进行日志记录

e) 对 API 调用、机密计算任务操作等进行日志记录和存储

f) 保证只有被列入可信清单的实体才可以访问机密计算环境;

g) 保证机密计算应用程序仅根据分配的权限访问相应的资源,不能越权访问。

基本接口

机密计算框架为应用程序提供的基本接口见表1。

安全机制

安全隔离 

安全隔离是保证用户敏感数据或应用程序运行在机密计算环境中的一种安全机制。该机制是机密计算业务运行的前提,包含了机密计算环境的创建以及机密计算应用程序的部署。结果需求方在请求机密计算服务时,会触发机密计算应用程序的加载和运行。安全隔离包括普通计算应用程序与机密计算应用程序之间的隔离,典型如图4所示,以及机密计算应用程序与机密计算应用程序之间的隔离,典型如图5所示。

普通计算应用程序与机密计算应用程序之间的安全隔离流程如下:

a) 普通计算应用程序在发起安全隔离请求前,预先创建机密计算环境

注:根据具体计算场景需求,机密计算环境也可在普通计算应用程序发起创建机密计算应用程序请求时,同步进行创建。

b) 普通计算应用程序调用机密计算统一服务平台提供的机密计算应用程序创建接口申请创建机密计算应用程序,机密计算统一服务平台对普通计算应用程序的请求进行处理,并根据硬件层架构创建机密计算应用程序,并将机密计算应用程序部署并运行在机密计算环境中;

c) 普通计算应用程序向机密计算应用程序发起计算请求;

d) 机密计算应用程序完成计算任务,并向普通计算应用程序传输机密数据或返回计算结果;

e) 完成所有计算任务后,普通计算应用程序发出销毁机密计算应用程序的请求,机密计算环境销毁机密计算应用程序,会话结束。 

机密计算应用程序与机密计算应用程序之间的安全隔离流程如下:

a) 机密计算应用程序 A 与机密计算应用程序 B 之间,先建立安全会话

b) 机密计算应用程序 A 向机密计算应用程序 B 发起计算请求;

c) 机密计算应用程序 B 完成计算任务,并向机密计算应用程序 A 返回计算结果;

d) 完成所有计算任务后,机密计算应用程序 A 发出关闭会话的请求,会话结束。 

安全启动

安全启动是保证机密计算环境的完整性和真实性的一种安全机制。在计算系统启动后,机密计算环境在建立前,需要从物理信任根开始,建立自下而上的信任链,逐层验证机密计算环境中的关键组件。安全启动典型流程如图6所示。

安全启动流程如下:

a) 机密计算信任根在启动后对机密计算关键固件或软件的数字签名进行验证,确保未被篡改后,加载关键固件或软件;

b) 关键固件和软件对机密计算应用程序的数字签名进行验证,确保未被篡改后,机密计算环境可以正常运行;

c) 在机密计算环境中,安全启动还可以扩展到每个应用程序的完整性验证,每次加载一个机密计算应用程序,机密计算关键固件或软件需要对机密计算应用程序进行验证,确保机密计算应用程序未被篡改后,加载可信的机密计算应用程序。 

远程证明

远程证明是远程证明发起方验证服务端机密计算环境机密计算应用程序完整性的一种安全机制。根据机密计算应用程序是否需要参与,远程证明典型流程有两种形式,其中,机密计算应用程序需要参与的流程如图7所示,机密计算应用程序无需参与的流程如图8所示。在远程证明典型流程中,远程证明发起方服务端分别部署在独立的计算节点远程证明服务器是第三方可信实体。

有机密计算应用程序参与的远程证明流程如下:

a) 远程证明发起方通过机密计算统一服务平台提供的远程证明接口,向服务端的普通计算应用程序发起证明挑战,通过发送随机值来防止重放攻击;

注:在虚拟化部署模式下,远程证明发起方可以直接向机密计算环境发起挑战,无需普通计算应用程序转发。

b) 服务端普通计算应用程序将挑战转发至对应的机密计算应用程序;

c) 机密计算应用程序接收到请求后,将挑战转发给远程证明模块;

d) 远程证明模块接收到请求后,将证明报告(至少包括机密计算环境的度量报告和机密计算应用程序的度量报告)返回至机密计算应用程序;

e) 机密计算应用程序将证明报告返回至普通计算应用程序;

f) 普通计算应用程序将证明报告返回至远程证明发起方;

g) 远程证明发起方将证明报告发送给远程证明服务器;  

h) 远程证明服务器验证证明报告中机密计算环境的度量信息(远程证明服务器维护了有效的机密计算环境列表),生成机密计算环境的验证结果,返回至远程证明发起方;  

i) 远程证明发起方在确定机密计算环境可信的前提下,对机密计算应用程序的度量报告进行验证(远程证明发起方维护了机密计算应用程序的基线值),判断机密计算应用程序的完整性是否被破坏。 

无机密计算应用程序参与的远程证明流程如下:

a) 远程证明发起方通过机密计算统一服务平台提供的远程证明接口,向服务端的机密计算环境服务发起证明挑战,通过发送随机值来防止重放攻击;

b) 服务端普通计算应用程序将挑战转发至机密计算环境的远程证明模块;

注:在虚拟化部署模式下,远程证明发起方可以向机密计算环境直接发起挑战,无需普通计算应用程序转发。

c) 远程证明模块接受到请求后,将证明报告(至少包括机密计算环境的度量报告和机密计算应用程序的度量报告)返回至普通计算应用程序;

d) 普通计算应用程序将机密计算环境的度量报告发送给远程证明服务器;  

e) 远程证明服务器验证证明报告中机密计算环境的度量报告(远程证明服务器自身维护了有效的机密计算环境列表),生成机密计算环境的验证结果,返回至服务端的普通计算应用程序;

 f) 普通计算应用程序将机密计算应用程序的度量报告及机密计算环境验证结果发送至远程证明发起方;  

g) 远程证明发起方在确定机密计算环境可信的前提下,对机密计算应用程序的度量报告进行验证(远程证明发起方维护了机密计算应用程序的基线值),判断机密计算应用程序的完整性是否被篡改。 

安全通道

安全通道是保护机密计算环境内外部通信安全的一种安全机制,典型流程如图9所示。其中,客户端和服务端分别部署在独立的计算节点

安全通道建立流程如下:

a) 客户端应用程序通过机密计算统一服务平台提供的安全通道初始化接口,向服务端发起构建安全通道请求;

b) 安全通道构建请求触发客户端应用程序向服务端机密计算环境发起远程证明请求,获取到携带公钥信息的远程证明报告,验证远程证明报告,证明机密计算应用程序完整性没有被破坏

注:机密计算应用程序随机生成一对公私钥,将公钥或者公钥摘要值作为远程证明报告的附加信息一起发送给客户端应用程序的安全通道代理,私钥缓存在内存中。

c) 客户端应用程序的安全通道代理基于公钥与服务器端机密计算应用程序的安全通道服务完成密钥协商,双方获得会话密钥,来执行加解密操作;

d) 其中步骤 c)是可选的,客户端应用程序的安全通道代理也可以根据业务场景直接选择使用公钥加密数据,服务端机密计算应用程序的安全代理服务使用私钥进行解密;

e) 完成安全通道构建后,客户端应用程序可通过安全通道与服务端机密计算应用程序完成安全通信。

注:普通计算应用程序作为可选组件。

密钥派生

密钥派生是保障机密计算环境中不同密码运算场景专属密钥需求的一种安全机制,其流程如图10所示。基于硬件密码引擎,以设备唯一密钥为根密钥,派生得到的密钥与受信任的硬件深度绑定,提高了数据机密性水平。

密钥派生流程如下:

a) 机密计算应用程序调用密钥派生接口触发机密计算系统软件执行密钥派生功能,首先使用硬件密码引擎将设备唯一密钥和机密计算应用程序标识作为输入,派生出机密计算应用程序的根密钥;b) 采用密码算法,将机密计算应用程序根密钥和盐值作为输入,计算出派生密钥,用来加密数据;

c) 派生密钥使用完毕,可以通过释放内存来销毁密钥,再次使用时可重新派生,实现一次一密的安全机制。 

安全存储

安全存储是一种保证结果需求方实现敏感数据加密存储,且只能由授权的机密计算应用程序访问或修改的安全机制,典型流程如图11所示。其中,客户端和服务端分别部署在独立的计算节点。

写数据块流程如下:

a) 客户端应用程序通过调用机密计算统一服务平台提供的安全存储接口,向服务端请求数据块写服务,并将数据库通过安全通道传输给服务端;

b) 服务端的普通计算应用程序触发机密计算应用程序接收任务,机密计算应用程序使用会话密钥或者私钥解密出数据块,并向密钥管理模块请求数据块加密密钥;

注:在虚拟化部署模式下,客户端可直接触发机密计算应用程序接收任务,无需普通计算应用程序转发。

c) 密钥管理模块生成数据块加密密钥,返回给机密计算应用程序;

d) 机密计算应用程序使用数据块加密密钥对数据提供方上传的数据内容进行加密,将加密后的数据块存储在普通计算环境的磁盘中;

注:也可存储在服务端外部的存储系统中。

e) 完成存储后,机密计算应用程序返回结果至客户端应用程序。

读数据块流程如下:

a) 客户端应用程序通过调用安全存储接口,向服务端请求获取原始数据块;  

b) 机密计算应用程序根据请求信息解析出需要获得的数据块名,并将数据块名发送至服务端的普通计算应用程序;

c) 普通计算应用程序根据数据块名,读取对应的加密数据块,并将加密数据块返回至机密计算应用程序;  

d) 机密计算应用程序向密钥管理模块请求数据块加密密钥,并解密加密数据块,获取数据块文件;  

e) 机密计算应用程序通过安全通道将数据块发送至客户端应用程序,流程结束。 

密码运算

密码运算是在机密计算环境中执行密码功能的一种安全机制,典型流程如图12所示。普通计算应用程序向机密计算应用程序发送密码功能请求,请求中可根据请求类型的不同,包含特定数目的参数,机密计算应用程序完成密码功能后返回密码功能响应给普通计算应用程序,响应中包含功能约定的处理结果。

密码功能请求包括但不限于以下类型:

a) 生成随机数。产生符合约定要求的随机数。约定的请求参数可包括随机数长度。

b) 生成密钥。产生符合约定要求的密钥,返回密钥响应。约定的参数可包括密钥算法、密钥长度,约定的响应内容可包括密钥数据、密钥索引或加密封装后的密钥数据。

c) 导出密钥。导出指定索引的密钥,返回密钥响应。约定的参数可包括索引以及其它附加信息,约定的响应内容可包括密钥数据或加密封装后的密钥数据。

d) 导入密钥。将密钥导入机密计算环境,返回密钥在机密计算环境的索引。约定的参数可包括封装后的密钥以及其它附加信息,约定的响应内容可包括密钥在机密计算环境的索引。

e) 加密数据。对约定的数据进行加密运算,返回加密结果。约定的参数可包括加密算法、加密模式、数据内容,其中数据可能的形式可包括、数据在机密计算环境中的索引、加密封装后的数据,约定的响应内容可包括密文结果以及各种用于解密的附加信息等。

f) 解密数据。对约定的数据进行解密运算,返回解密结果。约定的参数可包括解密算法、加密模式、密文数据,约定的响应内容可包括解密所得到的数据,或解密结果在机密计算环境中的索引,或再次加密封装后的数据。

g) 数字签名:对约定的数据进行数字签名,返回签名结果。约定的参数可包括待签名数据、签名算法以及其它数字签名所需的附加信息,其中数据可能的形式包括明文数据、待签名数据在机密计算环境中的索引,或加密封装后的数据。约定的响应内容可包括签名结果以及其它验证数字签名所需的附加信息。

h) 验证签名:对约定的待签名数据、公钥、数字签名进行验证,返回验证结果。约定的参数可包括待签名数据、签名算法、公钥、数字签名以及其它数字签名所需的附加信息,约定的响应内容可包括验签结果以及其它附加说明信息。 

数据封装

数据封装是一种使高敏感、高价值的数据与机密计算应用程序的完整性相绑定,在数据解封时,只有当机密计算应用程序的完整性未被篡改时,数据才可解封成功的安全机制,典型流程如图13所示。

数据封装流程如下:

a) 普通计算应用程序向机密计算应用程序发送数据封装请求;

b) 机密计算应用程序调用机密计算统一服务平台提供的数据封装接口,触发机密计算操作系统使用硬件密码引擎,将设备唯一密钥、机密计算应用程序标识和完整性度量值作为输入,生成根封装密钥

c) 机密计算操作系统将生成的随机数和机密计算应用程序标识作为输入,生成封装密钥;

d) 机密计算操作系统使用封装密钥对数据进行加密,使用根封装密钥对封装密钥进行加密;

e) 机密计算操作系统将封装后的数据和封装后的密钥组合发给机密计算应用程序,同时释放内存,销毁根封装密钥和密钥明文;

f) 机密计算应用程序将密封数据和封装的密钥返回至普通计算应用程序,普通计算应用程序将其存储在本地的磁盘中。  

数据解封装流程如下:

a) 普通计算应用程序向机密计算应用程序发送数据解封请求,并将封装数据和封装密钥发给机密计算应用程序;

b) 机密计算应用程序调用机密计算统一服务平台提供的数据解封装接口,触发机密计算操作系统使用硬件密码引擎,将该机密计算应用程序标识和完整性度量值作为输入,重新生成根封装密钥;c) 机密计算操作系统使用根封装密钥对封装密钥进行解密,获得密钥明文,使用密钥对密封数据进行解密,获得明文数据;

d) 机密计算操作系统将解封的数据发给机密计算应用程序,同时释放内存,销毁根封装密钥和封装密钥明文;

e) 机密计算应用程序解封后的数据发送至普通计算应用程序,流程结束。

 

 

 

 

 

 

 

 

 

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...