数据库高安全—openGauss安全整体架构安全认证
openGauss作为新一代自治安全数据库,提供了丰富的数据库基础安全能力,并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读,以帮助数据库内核开发者在进行内核开发时正确的理解和使用安全功能接口,持续为产品提供安全保护能力,或基于当前安全能力进一步开发新的安全能力。
1 openGauss安全整体架构
不同于数据库其他业务模块,安全管理模块并非逻辑集中的。安全管理模块中的安全能力是分散化的,在数据库整个业务逻辑的不同阶段提供对应的安全能力,从而构建数据库整体纵深安全防御能力。一个完整的安全管理整体架构如图1下所示:
图1 openGauss安全机制体系
虽然整个安全机制是分散化的,但是每一个安全子模块都独立负责了一个完整的安全能力。如安全认证机制模块主要解决用户访问控制,登录通道安全问题;用户角色管理模块解决用户创建及用户权限管理问题。因此整体的安全管理体系架构的代码解读也将根据整个体系的划分来进行描述。
认证机制子模块从业务流程上看主要包括认证配置文件管理、用户身份识别、口令校验等过程,其核心流程及接口定义如图2所示。
图2 openGauss安全认证代码接口
用户角色管理子模块从业务流程上看主要包括角色创建、修改、删除、授权和回收,由于openGauss并未严格区分用户和角色,因此用户的管理与角色管理共用一套接口,仅在部分属性上进行区分。角色管理子模块涉及的功能及其对应的接口如图3所示。
图3 openGauss角色管理代码接口
对象访问控制子模块从业务流程看主要包括对象授权、对象权限回收以及实际对象操作时的对象权限检查,其核心流程及接口定义如图4所示。
图4 openGauss对象权限管理代码接口
审计机制子模块主要包括审计日志的创建和管理,以及数据库的各类管理活动和业务活动的审计追溯。审计日志管理包括新创建审计日志、审计日志轮转、审计日志清理。审计日志追溯包括活动发生时的日志记录以及审计信息查询接口,其核心流程及接口定义如图5所示。
图5 openGauss审计线程(左)及审计日志记录(右)接口
2 安全认证
安全认证是数据库对外提供的第一道防线,数据库访问者只有完成身份识别,通过认证校验机制,才可以建立访问通道从事数据库管理活动。在整个安全认证过程中,涉及到用户身份管理识别、用户口令安全存储以及完善的认证机制3大模块,下面的小节将围绕这3个子模块进行涉及原理介绍和代码解析。
2.1 身份标识
安全认证机制要解决的核心问题是谁可以访问数据库的问题。因此在定义身份时,除了描述谁,还要清晰定义整个过程中哪个用户以何种方法访问、从何处访问,访问哪个数据库的问题,因此本小节重点介绍身份识别概念及源码。
身份识别是一个广义的概念,实际上定义了数据库系统的访问规则。openGauss的访问规则信息主要被记录在配置文件HBA(Host-Based Authentication File,主机认证)中,HBA文件中的每一行代表一个访问规则,其书写格式如下:
hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
其中第1列代表套接字方法,第2列代表允许被访问的数据库,第3列代表允许被访问的用户,第4列代表允许访问的IP地址,第5列代表访问的认证方式,第6列则作为对第五列认证信息的补充。在定义访问规则时,需要按照访问的优先级来组织信息。对于访问需求高的规则建议写在前面。
在openGauss源码中,定义了存储访问规则的关键数据结构HbaLine,核心元素如下所示:
typedef struct HbaLine
其中,字段conntype,database,roles,hostname以及auth_method分别对应HBA配置文件中的套接字方法、允许被访问的数据库、允许被访问的用户,IP地址以及当前该规则的认证方法。
当系统管理员配置完HBA文件后,配置文件被存放在数据库服务端侧。当某个用户通过数据库用户发起认证请求时,连接相关的信息都存放在关键数据结构Port中,如下所示:
typedef struct Port {
其中Port结构中的user_name、database_name、raddr以及对应的hba等字段就是认证相关的用户信息、访问数据库信息以及IP地址信息。与此同时Port结构中还包含了SSL认证相关的信息以及节点间做Kerberos认证相关的信息。有了Port信息,后台服务线程会根据前端传入的信息与HbaLine中记录的信息逐一比较,完成对应的身份识别。完整的身份标识过程见函数check_hba(),其核心逻辑如下所示:
/**扫描hba文件,寻找匹配连接请求的规则项 */
2.2 口令存储
口令是安全认证过程中的重要凭证。openGauss数据库在执行创建用户或修改用户口令操作时,会将口令通过单向哈希方式加密后存储在pg_authid系统表中。口令加密的方式与参数password_encryption_type的配置有关,目前系统支持md5、sha256 + md5(同时存储sha256和md5哈希值)和sha256三种方式,默认采用sha256方式加密。为兼容PostgreSQL社区和第三方工具,openGauss保留了md5方式,此方式安全性较低不推荐用户使用。
口令的加密方式与认证方式密切相关,选择不同的加密方式需要对应的修改pg_hba.conf中的认证方式。口令加密与认证方式对应关系如下表所示:
表1. 口令加密与认证方式
password_encryption_type
加密方式
(hash算法)
认证方式
(pg_hba.conf)
加密函数接口
0
md5
md5
pg_md5_encrypt
1
sha256 + md5
sha256或md5
calculate_encrypted_combined_password
2(默认值)
sha256
sha256
calculate_encrypted_sha256_password
创建用户和修改用户属性的函数入口分别为CreateRole和AlterRole。在函数内对口令加密前,会先校验是否满足口令复杂度,如果满足则调用calculate_encrypted_password函数实现口令的加密。加密时根据参数password_encryption_type配置选择对应的加密方式,加密完成后会清理内存中的敏感信息并返回口令密文。口令加密流程如下图6所示:
图6 口令加密流程图
如图9-6所示,通过调用calculate_encrypted_sha256_password函数实现sha256加密方式,通过调用pg_md5_encrypt函数实现md5方式,而calculate_encrypted_combined_password函数则融合了前面两种加密方式,加密后系统表中包含了sha256和md5两种哈希值。实现sha256加密的calculate_encrypted_sha256_password函数执行流程如图7所示。
图7 calculate_encrypted_sha256_password函数执行流程
2.3 认证机制
整个认证过程中,身份标识完成后,需要完成最后的认证识别。通过用户名和密码来验证数据库用户的身份,判断其是否为合法用户。openGauss使用基于RFC5802协议的口令认证方案,该方案是一套包含服务器和客户端双向认证的用户认证机制。
首先,客户端知道用户名username和密码password,客户端发送用户名username给服务端,服务端检索相应的认证信息,例如:salt、StoredKey、ServerKey和迭代次数。然后,服务端发送盐值salt和迭代次数给客户端。接下来,客户端需要进行一些计算,给服务端发送ClientProof认证信息,服务端通过ClientProof对客户端进行认证,并发送ServerSignature给客户端。最后,客户端通过ServerSignature对服务端进行认证。具体秘钥计算如下所示:
SaltedPassword := Hi(password, salt, iteration_count) 其中,Hi()本质上是PBKDF2。
具体秘钥衍生过程如图8所示。
图8 秘钥衍生过程
服务器端存的是StoredKey和ServerKey:
StoredKey是用来验证客户端用户身份。
服务端认证客户端通过计算ClientSignature与客户端发来的ClientProof进行异或运算,从而恢复得到ClientKey,然后将其进行HMAC(Hash-based Message Authentication Code,散列信息认证码)运算,将得到的值与StoredKey进行对比,如果相等,证明客户端验证通过。其中ClientSignature通过StoredKey和token(随机数)进行HMAC计算得到。
ServerKey是用来向客户端表明自己身份的。
类似的,客户端认证服务端,通过计算ServerSignature与服务端发来的值进行比较,如果相等,则完成对服务端的认证。其中ServerSignature通过ServerKey和token(随机数)进行HMAC计算得到。
在认证过程中,服务端可以计算出来ClientKey,验证完后直接丢弃不必存储。
防止服务端伪造认证信息ClientProof,从而仿冒客户端。
接下来详细描述在一个认证会话期间的客户端和服务端的信息交换过程。如图9所示:
图9 openGauss认证流程
客户端发送username。
服务端返回盐值salt、iteration-count(迭代次数)、ServerSignature以及随机生成的字符串token给客户端。token是随机生成字符串。服务端通过计算得到的ServerSignature返回给客户端。
ServerSignature := HMAC(ServerKey, token)
客户端认证服务端并发送认证响应。响应信息包含客户端认证信息ClientProof。ClientProof证明客户端拥有ClientKey,但是不通过网络的方式发送。在收到信息后,计算ClientProof。
客户端利用salt和iteration-count,从password计算得到SaltedPassword,然后通过图9中的公式计算得到ClientKey、 StoryKey和ServerKey。
客户端通过StoredKey和token进行哈希计算得到ClientSignature:
ClientSignature := HMAC(StoredKey,token)
通过将ClientKey和ClientSignature进行异或得到ClientProof:
ClientProof := ClientKey XOR ClientSignature
将计算得到的ClientProof和第2步接收的随机字符串发送给服务端进行认证。
服务端接收并校验客户端信息。
使用其保存的StoredKey和token通过HMAC算法进行计算,然后与客户端传来的ClientProof进行异或,恢复ClientKey,再对ClientKey进行哈希计算,得到的结果与服务端保存的StoredKey进行比较。如果相等,则服务端对客户端的认证通过。否则,认证失败。
ClientSignature := HMAC(StoredKey, token)
HMAC(ClientProof XOR ClientSignature ) = StoredKey
客户端认证的过程通过调用ClientAuthentication函数完成,该函数只有一个类型Port的参数,Port结构中存储着客户端相关信息。完整的客户端认证过程见函数ClientAuthentication (),如下所示:
void ClientAuthentication(Port* port)
在这个ClientAuthentication函数中,通过调用函数hba_getauthmethod,然后调用check_hba函数,检查客户端地址、所连接数据库、用户名在文件HBA中是否有能匹配的HBA记录。如果能够找到匹配的HBA记录,则将Port结构中相关认证方法的字段设置为HBA记录中的参数,同时状态值为STATUS_OK。然后,根据不同的认证方法,进行相应的认证过程。具体认证方法如表2。在认证过程中可能需要和客户端进行多次交互。最后返回如果为STAUS_OK,则表示认证成功,并将认证成功的信息发送回客户端,否则发送认证失败的信息。
表2 认证方法
认证方法
值
描述
uaReject
0
无条件的拒绝连接
uaTrust
3
无条件的允许连接,这个方法允许被该HBA记录匹配的客户端直接连入数据库。
uaMD5
5
要求客户端提供一个MD5加密口令进行认证。
uaSHA256
6
要求客户端提供SHA256加密口令进行认证。
uaGSS
7
通过GSSAPI认证用户。
接下来介绍客户端认证服务端并发送认证响应。客户端根据不同的认证方法进行不同的处理过程,当前方法为AUTH_REQ_SHA256时,通过调用函数pg_password_sendauth完成对服务端的认证,如下所示:
static int pg_password_sendauth(PGconn* conn, const char* password, AuthRequest areq)
2.4 Kerberos安全认证
Kerberos是一种基于对称秘钥技术的身份认证协议,开源组件Kerberos可以解决集群内节点或者进程之间的认证问题,即当开启kerberos之后,恶意用户无法仿冒集群内节点或进程来登录数据库系统,只有内部组件才可以持有用于认证的凭证,从而保证通过Kerberos认证,消减了仿冒风险,提升了数据库系统的安全性。Kerberos协议具体交互如图10所示。
图10 Kerberos认证标准交互流程
其中各角色和定义如下,为下文描述方便,均以缩写代替:
表3 Kerberos协议角色
KDC(Key Distribution Center)
Kerberos服务程序
Client
需要访问服务的用户(principal),KDC和Service会对用户的身份进行认证
Service
集成了Kerberos的服务,被访问的服务,需要对客户端进行认证
AS(Authentication Service,认证服务)
AS服务器用于身份的校验, 内部会存储所有的账号信息
TGS(Ticket Granting Service,票据授权服务)
TGT(Ticket-Granting Ticket)票据分发服务
openGauss可在数据库系统部署完毕之后开启Kerberos模式,即Kerberos服务部署在数据库系统机器上,部署过程中会开启Kerberos相关的服务,并派发凭证给集群内部所有的节点,初始化一系列Kerberos需要用到的环境变量,数据库内核中通过调用GSS-API来实现Kebreros标准协议的通信内容,下面给出在Kerberos开启后openGauss内部进程之间认证流程,以openGauss主备之间的认证为例:
图11 数据库系统Kerberos认证流程
Kerberos提供用户(数据库管理员)透明的认证机制,数据库管理员无需感知Kerberos进程/部署情况。分两部分描述Kerberos交互,左侧虚线框内的Kerberos协议实现部分由OM(Operations Management,运维管理模块)工具完成,OM工具在Kerberos初始化的时候将KDC服务拉起(krb5kdc进程),其内置了两个服务:AS和TGS服务,客户端(openGauss主备等数据库服务进程)在登录对端之前会先和KDC交互拿到TGT(Ticket Granting Ticket,根凭证),这个步骤由OM拉起的定时任务调用Kerebros提供刷新票据工具来实现,默认24小时重新获取1次。这个获取TGT的过程对应Kerberos标准协议中AS-REQ、AS-REP、TGS-REQ和TGS-REP。
在数据库内核侧,主要是图12右侧虚线框内的AP-REQ流程实现,简化流程如图12所示。
图12 数据库系统内核认证交互
数据库内核封装GSS-API提供数据结构和API实现认证交互,关键数据结构如下:
?????typedef struct GssConn {int sock;gss_ctx_id_t gctx; // GSS 上下文gss_name_t gtarg_nam; // GSS 名称gss_buffer_desc ginbuf; // GSS 输入tokengss_buffer_desc goutbuf; // GSS 输出token
} GssConn;
// 客户端、服务端接口, 用于封装标准kerberos协议调用, 其中客户端接口用于向服务端
// 发起访问,同时响应服务端接口GssServerAuth发起的票据请求
int GssClientAuth(int socket, char* server_host);
int GssServerAuth(int socket, const char* krb_keyfile);
图13 数据库内核Kerberos认证时序图
具体交互逻辑时序如图13所示。
-
首先服务端通过数据库配置文件决定使用Kerberos协议对客户端连接进行认证。
-
然后发起认证请求,客户端准备需要Kerberos认证的环境和票证,发’P’报文响应请求并发送票证。
-
服务端验证通过后会发送响应’R’报文,完成Kerberos认证。
以上内容从安全整体架构与安全认证两方面,对高斯数据库的高安全性能进行了详细解读,下篇我们将从角色权限方面继续介绍高斯数据库的高安全技术,敬请期待~
相关文章:
数据库高安全—openGauss安全整体架构安全认证
openGauss作为新一代自治安全数据库,提供了丰富的数据库基础安全能力,并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读,以帮助数据…...
利用开源小智AI制作桌宠机器狗
本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...
uniapp在app下使用mqtt协议!!!支持vue3
什么?打包空白?分享一下我的解决方法! 第一步 找大师算过了,装4.1版本运气好! 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法! // utils/mqtt.js import mqt…...
Orange 开源项目 - 集成阿里云大模型
1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在5分钟内开发出一款大模型应用,或在几小时内训练…...
DSP芯片C6678的SRIO及其中断跳转的配置
C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码,部分参考于网友们的博客…...
MongoDB#常用脚本
批量插入数据脚本 const oneDayAgo new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);const documents []; for (let i 1; i < 100; i) {documents.push({id: i, // 递增的 idcreateTime: oneDayAgo, // 1天前的日期data: Sample data ${i} // 其他字段(可选…...
MySQL 主从集群同步延迟问题分析与解决方案
MySQL 主从复制(Replication)是构建高可用架构的核心技术,但在实际应用中,主从同步延迟(Replication Lag)是常见且棘手的问题。延迟会导致从库数据不一致、读请求返回旧数据,甚至引发业务逻辑错…...
论文笔记(七十二)Reward Centering(五)
Reward Centering(五) 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...
FFmpeg 是什么?为什么?怎么用?
摘要:本文介绍了 FFmpeg,一个功能强大的开源多媒体处理工具,广泛应用于视频和音频文件的处理。FFmpeg 支持多种多媒体格式,能够实现视频编码/解码、格式转换、裁剪、合并、音频提取、流媒体处理等功能。本文详细阐述了 FFmpeg 的主…...
雷池WAF动态防护技术实测
作者; Hacker / 0xh4ck3r 介绍 长亭雷池(SafeLine)是由北京长亭科技有限公司耗时近10年研发并推出的Web应用防火墙(WAF),其核心检测能力由智能语义分析算法驱动。雷池旨在为用户提供高质量的Web攻击防护、…...
BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】
模板: {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串,.__class__代表这个空字符串的类是什么(这里是单引号双引号都行&a…...
【每日八股】Redis篇(二):数据结构
Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…...
VScode+stfp插件,实现文件远程同步保存【2025实操有效】
目录 1 痛点2 准备工作3 操作步骤3.1 第一步,下载STFP插件3.2 第二步,修改配置文件3.3 第三步,测试是否成功 4 后记 1 痛点 我一直用vscode远程连接服务器,传代码文件等到服务器上面,突然有一次服务器那边尽心维修&am…...
115 道 MySQL 面试题,从简单到深入!
1. 什么是数据库事务? 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性…...
不同安装路径重复R包清理
df <- as.data.frame(installed.packages()) table(duplicated(df$Package)) ids <- df$Package[duplicated(df$Package)] df2 <- subset(df, df$Package %in% ids)...
Grouped-Query Attention(GQA)详解: Pytorch实现
Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…...
选择排序:简单高效的选择
大家好,今天我们来聊聊选择排序(Selection Sort)算法。这是一个非常简单的排序算法,适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称,虽然它的效率不如其他高效算法…...
(教程)PDF 字体技术入门
PDF字体技术 许多人觉得PDF字体令人困惑的主要原因在于PDF文件可以使用多种不同的字体技术。PDF文件规范已经存在16年,在此期间,出现了多种不同的字体技术(既有技术方面的原因,也有商业方面的原因)。因此,…...
LabVIEW中CFURL.llb 工具库说明
CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库,主要用于处理 LabVIEW 与 URL 相关的操作,涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块,帮助开发者…...
BGP配置华为——路径优选验证
实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…...
Linux8-互斥锁、信号量
一、前情回顾 void perror(const char *s);功能:参数: 二、资源竞争 1.多线程访问临界资源时存在资源竞争(存在资源竞争、造成数据错乱) 临界资源:多个线程可以同时操作的资源空间(全局变量、共享内存&a…...
【Springboot3】Springboot3 搭建RocketMQ 最简单案例
说来也奇怪,RocketMQ 不能很好的兼容Springboot3,刚开始上手Springboot3集成RocketMQ会发现总是不能实例化RocketMQTemplate,老是启动时报错。本项目采用Springboot3,JDK21 ,Maven 3.9,提供一个非常简单的示…...
使用docker安装mysql 挂起之后 再次运行无法连接问题
# 首先 vim /usr/lib/sysctl.d/00-system.conf # 在最后面添加 net.ipv4.ip_forward 1 # 然后保存退出,接着重启网络服务 systemctl restart network # 重启以后,输入以下命令,查看IPv4转发状态 sysctl net.ipv4.ip_forward # 显示net.ipv4…...
hot100-二叉树
二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…...
从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)
1.安装mogondb数据库 参考MongoDB安装配置教程(详细版)_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…...
基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Plantsimulation中机器人怎么通过阻塞角度设置旋转135°
创建一个这样的简单模型。 检查PickAndPlace的角度表。源位于180的角位置,而物料终结位于90的角位置。“返回默认位置”选项未被勾选。源每分钟生成一个零件。启动模拟时,Plant Simulation会选择两个位置之间的最短路径。示例中的机器人无法绕135的角位…...
2025.2.23机器学习笔记:PINN文献阅读
2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊: IEEE TRANSACTIONS ON ARTIFICI…...
关于Postman自动获取token
在使用postman测试联调接口时,可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证,最直接的办法可能会是一步一步的点击,如下图: 在Authorization中去选择Bearer Token,然后将获取到的token粘贴…...
Android KMP初探
Android KMP初探 前言: 最近线上听了Kotlin官网举行的KMP会议,感觉听神奇的,于是就把官方demo下载下来尝试了一下,下载插件和所需要的依赖都用了很久,但是发现里面的代码很少,于是尝试自己手写了一下&…...
ncDLRES:一种基于动态LSTM和ResNet的非编码RNA家族预测新方法
现有的计算方法主要分为两类:第一类是通过学习序列或二级结构的特征来预测ncRNAs家族,另一类是通过同源序列之间的比对来预测ncRNAs家族。在第一类中,一些方法通过学习预测的二级结构特征来预测ncRNAs家族。二级结构预测的不准确性可能会导致…...
前端项目打包过滤指定icon文件
1.需求背景 项目中有部分功能需要vip权限才可以使用,所有部分筛选、按钮 等有vip的icon提示 如下图 此项目衍生出一个特殊版本,此版本无需登录且拥有最高权限,所以产品要求去除项目中的所有vip相关的提示。 2.解决思路 (1&am…...
蓝桥杯 Java B 组之最短路径算法(Dijkstra、Floyd-Warshall)
Day 2:最短路径算法(Dijkstra、Floyd-Warshall) 📖 一、最短路径算法简介 最短路径问题是图论中的经典问题,主要用于求解 单源最短路径 或 多源最短路径。在实际应用中,最短路径广泛应用于 导航系统、网络…...
科普:HTTP端口80和HTTPS端口443
你会发现,有的网址不带端口号,怎么回事? HTTP协议默认端口:HTTP协议的默认端口是80。当用户在浏览器中输入一个没有指定端口的以http://开头的网址时,浏览器会自动使用80端口与服务器建立连接,进行超文本数…...
如何安装vm和centos
安装 VMware Workstation Pro 步骤 1:下载 VMware Workstation Pro 访问 VMware 官方网站(Desktop Hypervisor Solutions | VMware ),根据你的操作系统选择合适的版本进行下载。 步骤 2:运行安装程序 找到下载的安装…...
鸿蒙-验证码输入框的几种实现方式-上
文章目录 效果图、优缺点多TextInput多 TextCanvas 绘制 多个 TextInput 拼接放置四个输入框焦点移动输入时向后移动输入完成回调删除时向前移动 防止点击总结 最近在做应用鸿蒙化,说白了就是把原来Android、iOS的代码重新用ArkTS写一遍,我负责基础建设和…...
Vi 编辑器基本使用指南
一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中,输入vi加上要编辑的文件名,如vi example.txt,如果example.txt存在,Vi 编辑器会打开该文件;若不存在,则会创建一个新的空文件并打开。如果只输入vi&am…...
centos 7 安装python3 及pycharm远程连接方法
安装openssl 使用pip3安装 virtualenv的时候会提示WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 这是因为缺少openssl 2.0以上版本 解决办法: 一、先确认版本 openssl version 二、安…...
PostgreSQL 使用pgAdmin 4 数据库还原sql文件报错问题分析
sql执行报错问题: C:\Program Files\PostgreSQL\17\bin\pg_restore.exe --host "localhost" --port "5433" --username "postgres" --no-password --dbname "ry_postgresql-final" --verbose "E:\\PostgreSQLProject\\Ruoyi-Po…...
gihub上适合练手的Python项目
GitHub 上有许多适合练手的 Python 项目,涵盖了从初学者到中级开发者的不同难度级别。以下是一些推荐的项目类型和具体示例,帮助你提升 Python 编程技能: 1. 基础项目 适合初学者,帮助掌握 Python 基础语法和常用库。 示例项目&…...
3D Web轻量化引擎HOOPS Communicator如何赋能航空航天制造?
在当今航空航天制造领域,精确度、效率和协作是推动行业发展的关键要素。随着数字化技术的飞速发展,3D Web可视化开发包HOOPS Communicator 为航空航天制造带来了革命性的变化。它凭借强大的功能和灵活的应用,助力企业在设计、生产、培训等各个…...
AWQ和GPTQ量化的区别
一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…...
通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形
论文标题 英文标题:Improving TSN Traffic Shaping with Constant Bandwidth Server Scheduling 中文标题:通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形 作者信息 作者:Benjamin van Seggelen 指导教师&am…...
气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
前言 在干旱研究中,一个关键的科学问题是:在某一地区发生不同等级的气象干旱时,气象干旱会以何种概率引发不同等级的水文干旱、农业干旱和地下水干旱?换句话说,气象干旱的不同程度会分别引发其他类型干旱的哪种等级&a…...
自定义Spring Boot Starter(官网文档解读)
摘要 本文将详细介绍自定义 Spring Boot Starter 的完整过程。要构建自定义 Starter,首先需掌握 Spring Boot 中 Auto-configuration 以及相关注解的工作原理,同时了解 Spring Boot 提供的一系列条件注解。在具备这些知识基础后,再按照特定步…...
开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题
开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题 在技术博客平台中,外链的使用常常受到限制,这给我们的写作和内容展示带来了一定的不便。为了应对这一问题,我开发了 picgo-plugin-huawei 插件,它能够有效…...
最长回文子串
标题 1.1 问题描述 给你一个字符串 s,找到 s 中最长的回文子串。 1.2 示例 1.2.1 示例1 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 1.2.2 示例2 输入:s “cbbd” 输出:“bb…...
JavaSE学习笔记26-集合(Collection)
集合 Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
开源神器KRR:用数据驱动K8s资源优化
引言:云原生时代的资源管理之痛 在Kubernetes集群中,过度配置导致资源浪费与配置不足引发稳定性风险的矛盾始终存在。CNCF调研显示,企业平均有35%的云资源处于闲置状态。本文将揭秘开源神器KRR(Kubernetes Resource Recommender),通过数据驱动方式实现精准资源配置,实测…...
微信小程序:多菜单栏设计效果
一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...