非对称加密算法(RSA、ECC、SM2)——密码学基础

对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案)

这篇的续篇,因此实践部分少些;


文章目录

  • 一、非对称加密算法基础
  • 二、RSA算法
    • 2.1 RSA原理与数学基础
    • 2.2 RSA密钥长度与安全性
    • 2.3 RSA实现工具与库
    • 2.4 RSA的局限性
  • 三、椭圆曲线密码学(ECC)
    • 3.1 ECC原理与数学基础
    • 3.2 常用椭圆曲线标准
    • 3.3 ECC与RSA比较
    • 3.4 ECC实现工具与库
  • 四、国密算法SM2
    • 4.1 SM2算法概述
    • 4.2 SM2技术特点
    • 4.3 SM2与国际算法对比
    • 4.4 SM2实现与应用
  • 五、非对称加密实践建议
    • 5.1 密钥管理
    • 5.2 安全实现注意事项
    • 5.3 混合加密系统设计
    • 5.4 跨境合规与算法选择
  • 六、未来发展与量子安全
    • 6.1 量子计算威胁
    • 6.2 后量子密码学
    • 6.3 算法过渡策略
    • 6.4 永恒密钥问题与前向保密
  • 七、总结与建议
  • 附录:专业术语表


一、非对称加密算法基础

非对称加密概述

非对称加密是现代密码学的基石,它使用一对密钥(公钥和私钥)进行加密和解密操作。与传统的对称加密不同,非对称加密解决了密钥分发的难题,为互联网安全通信奠定了基础。

非对称加密的基本工作原理是:

  • 使用接收方的公钥加密信息,只有拥有对应私钥的接收方才能解密
  • 使用发送方的私钥签名信息,任何人都可以使用发送方的公钥验证签名的真实性

这种机制为网络通信带来了机密性、完整性和不可否认性等关键安全特性。

常见应用场景

非对称加密在日常数字生活中无处不在:

  • HTTPS安全通信:保护网络浏览安全
  • 数字签名:确保电子文档的真实性和完整性
  • PKI(公钥基础设施):管理和分发数字证书
  • SSH安全连接:保护远程服务器访问
  • 区块链与加密货币:保护数字资产交易
  • 安全电子邮件:加密敏感通信内容

二、RSA算法

2.1 RSA原理与数学基础

RSA算法由Ron Rivest、Adi Shamir和Leonard Adleman三位密码学家于1977年提出,是最早的公钥密码系统之一,至今仍被广泛使用。

RSA的安全性基于大整数分解的计算困难性。其核心数学原理如下:

  1. 选择两个大质数p和q,计算乘积n = p × q
  2. 计算欧拉函数φ(n) = (p-1) × (q-1)
  3. 选择一个与φ(n)互质的整数e作为公钥指数
  4. 计算e的模反元素d,使得e × d ≡ 1 (mod φ(n)),d作为私钥指数
  5. 公钥为(n, e),私钥为(n, d)

加密过程:c = m^e mod n (其中m为明文)
解密过程:m = c^d mod n (其中c为密文)

2.2 RSA密钥长度与安全性

RSA的安全性主要取决于密钥长度,常见的密钥长度包括:

  • 1024位:已被认为不够安全,不应在新系统中使用
  • 2048位:当前推荐的最低标准,适合一般应用
  • 3072位:满足中等安全需求,预计安全至2030年
  • 4096位:提供更高安全性,适合对安全有极高要求的场景

密钥长度增加会降低性能,需要在安全性和效率之间权衡。美国国家标准与技术研究院(NIST)和各国密码管理机构会定期更新密钥长度推荐标准。

2.3 RSA实现工具与库

实现RSA加密时,应尽量使用经过充分测试的开源库,而非自行实现:

  • OpenSSL:跨平台的开源密码学工具包和库

    # 生成RSA私钥
    openssl genrsa -out private.pem 2048
    # 从私钥提取公钥
    openssl rsa -in private.pem -pubout -out public.pem
    # 使用公钥加密文件
    openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt -out encrypted.txt
    # 使用私钥解密文件
    openssl rsautl -decrypt -inkey private.pem -in encrypted.txt -out decrypted.txt
    
  • 编程语言库:

    • Java: java.security和Bouncy Castle
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
    keyGen.initialize(2048);
    KeyPair pair = keyGen.generateKeyPair();
    PublicKey publicKey = pair.getPublic();
    PrivateKey privateKey = pair.getPrivate();
    
    • Python: cryptography和PyCryptodome
    from cryptography.hazmat.primitives.asymmetric import rsa
    private_key = rsa.generate_private_key(public_exponent=65537,key_size=2048
    )
    public_key = private_key.public_key()
    
    • .NET: System.Security.Cryptography
    using (RSA rsa = RSA.Create(2048))
    {string publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey());string privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());
    }
    

2.4 RSA的局限性

尽管RSA广泛应用,但它也存在一些局限:

  • 性能问题:RSA运算相对耗时,不适合加密大量数据
  • 量子计算威胁:理论上,量子计算机可以使用Shor算法在多项式时间内分解大整数
  • 实现漏洞:不当实现可能导致侧信道攻击

在实际应用中,通常将RSA与对称加密结合使用:用RSA加密对称密钥,再用对称密钥加密实际数据,这种混合加密既保证了安全性,又提高了效率。


三、椭圆曲线密码学(ECC)

3.1 ECC原理与数学基础

椭圆曲线密码学基于椭圆曲线上的离散对数问题,其数学复杂度比整数分解更高,因此可以用更短的密钥提供同等安全级别。

ECC的基本椭圆曲线方程形式为:y² = x³ + ax + b (mod p)

其中关键的数学原理包括:

  1. 定义在有限域上的椭圆曲线点集
  2. 曲线上点的加法运算
  3. 点的标量乘法(即连续加法):Q = kP,已知P和k容易计算Q,但已知P和Q难以求解k

这一数学难题称为椭圆曲线离散对数问题(ECDLP),是ECC安全性的基础。

3.2 常用椭圆曲线标准

实际应用中,使用标准化的椭圆曲线参数集可确保安全性和互操作性:

  • NIST曲线:美国标准,如P-256、P-384和P-521
  • Brainpool曲线:欧洲标准,提供替代参数集
  • Curve25519和Curve448:更现代的曲线,设计目标是抵抗侧信道攻击
  • secp256k1:比特币和以太坊等加密货币使用的曲线

选择曲线时应考虑安全性、性能和各国监管要求。

3.3 ECC与RSA比较

ECC相比RSA的主要优势:

安全级别RSA密钥长度ECC密钥长度ECC优势比例
80位1024位160-223位约5倍
112位2048位224-255位约8倍
128位3072位256-383位约12倍
192位7680位384-511位约20倍
256位15360位512位以上约30倍

ECC的其他优势:

  • 更低的计算复杂度,特别适合资源受限设备
  • 更小的密文和签名大小,节省带宽和存储空间
  • 更快的密钥生成速度

缺点:

  • 实现复杂度高于RSA
  • 专利问题(部分曲线和实现)
  • 相对较新,长期安全性评估少于RSA

3.4 ECC实现工具与库

  • OpenSSL支持多种椭圆曲线:

    # 查看支持的椭圆曲线
    openssl ecparam -list_curves# 生成ECC私钥(使用P-256曲线)
    openssl ecparam -name prime256v1 -genkey -noout -out private.pem# 从私钥提取公钥
    openssl ec -in private.pem -pubout -out public.pem
    
  • 编程语言库:

    • Java:
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
    ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1");
    keyGen.initialize(ecSpec);
    KeyPair pair = keyGen.generateKeyPair();
    
    • Python:
    from cryptography.hazmat.primitives.asymmetric import ec
    private_key = ec.generate_private_key(ec.SECP256R1()
    )
    public_key = private_key.public_key()
    
    • JavaScript (使用Web Crypto API):
    async function generateECDHKeys() {const keyPair = await window.crypto.subtle.generateKey({name: "ECDH",namedCurve: "P-256"},true,["deriveKey", "deriveBits"]);return keyPair;
    }
    

四、国密算法SM2

4.1 SM2算法概述

SM2是中国商用密码算法标准之一,由国家密码管理局于2010年发布,是基于椭圆曲线密码学的非对称加密算法。SM2是"国密"体系中的重要组成部分,与SM3(哈希算法)和SM4(对称加密算法)共同构建中国自主知识产权的密码体系。

SM2包含三部分功能:

  • 数字签名算法
  • 密钥交换协议
  • 公钥加密算法

4.2 SM2技术特点

SM2具有以下技术特点:

  • 基于椭圆曲线数学原理,曲线方程为:y² = x³ + ax + b (mod p)
  • 使用256位密钥长度,安全性等同于RSA 3072位
  • 采用中国自定义的椭圆曲线参数

4.3 SM2与国际算法对比

SM2与国际常用的ECC算法相比:

  • 安全性:理论上与同等密钥长度的国际ECC算法具有相当安全性
  • 性能:在中国设计的密码硬件上可能有更优的性能表现
  • 算法差异:采用不同的椭圆曲线参数和预处理方法
  • 应用范围:在中国政府、金融机构和关键基础设施中强制使用

对于跨国企业,需要同时支持国际标准和国密标准。

4.4 SM2实现与应用

SM2在中国有广泛应用:

  • 电子政务系统
  • 金融支付系统
  • 数字证书
  • 安全通信
  • 网络身份认证

实现SM2的工具与库:

  • GmSSL:支持国密算法的OpenSSL分支

    # 生成SM2密钥对
    gmssl sm2keygen -out sm2.key# 从私钥提取公钥
    gmssl sm2pubout -in sm2.key -out sm2.pub# 使用公钥加密
    gmssl sm2encrypt -in plaintext.txt -inkey sm2.pub -out ciphertext.bin# 使用私钥解密
    gmssl sm2decrypt -in ciphertext.bin -inkey sm2.key -out decrypted.txt
    
  • 编程语言支持:

    • Java: Bouncy Castle提供SM2支持
    ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");
    kpg.initialize(sm2Spec);
    KeyPair keyPair = kpg.generateKeyPair();
    
    • Go: tjfoc/gmsm库
    import "github.com/tjfoc/gmsm/sm2"privateKey, _ := sm2.GenerateKey()
    publicKey := &privateKey.PublicKey
    

五、非对称加密实践建议

5.1 密钥管理

良好的密钥管理是非对称加密安全的基础:

  • 私钥保护:

    • 使用硬件安全模块(HSM)或可信平台模块(TPM)存储私钥
    • 加密存储私钥,使用强密码和密钥派生函数(KDF)
    • 实施最小权限原则,限制私钥访问
    • 定期轮换密钥,减少长期暴露风险
  • 公钥分发:

    • 使用可信的公钥基础设施(PKI)
    • 验证公钥指纹或哈希值
    • 使用带外渠道确认公钥
  • 密钥备份与灾难恢复:

    • 安全备份私钥,考虑分片存储
    • 制定密钥恢复流程,防止单点故障
    • 记录密钥元数据,如算法、长度、用途和过期日期

5.2 安全实现注意事项

非对称加密实现中的常见安全隐患:

  • 随机数生成:使用密码学安全的随机数生成器(CSPRNG)
  • 填充机制:采用OAEP等现代填充方案,避免传统PKCS#1 v1.5填充
  • 侧信道防护:实施恒定时间算法和内存清理
  • 算法参数验证:验证输入参数,防止小子群攻击等
  • 错误处理:使用一致的错误消息,避免泄露敏感信息

5.3 混合加密系统设计

实际应用中,通常将非对称加密与对称加密结合:

  1. 随机生成会话密钥(对称密钥)
  2. 使用非对称公钥加密会话密钥
  3. 使用会话密钥加密实际数据
  4. 传输加密的会话密钥和数据

这种方法结合了非对称加密的密钥管理优势和对称加密的性能优势。

TLS协议是混合加密的典型应用:

  • 使用非对称加密进行身份认证和密钥交换
  • 协商会话密钥后使用对称加密保护通信内容

5.4 跨境合规与算法选择

全球化业务面临的密码算法合规问题:

  • 中国:关键信息基础设施需使用国密算法(SM2/SM3/SM4)
  • 美国:政府系统通常使用NIST批准的算法
  • 欧盟:遵循ETSI和ENISA标准
  • 俄罗斯:某些场景要求使用GOST算法

解决方案:

  • 开发多算法支持架构
  • 实施区域性密码政策
  • 保持算法更新机制,应对新标准和安全威胁

六、未来发展与量子安全

6.1 量子计算威胁

量子计算对当前非对称加密构成严重威胁:

  • Shor算法:理论上可以在多项式时间内解决整数分解和离散对数问题
  • 影响:RSA、DSA、ECC等传统非对称算法将不再安全
  • 时间窗口:专家估计实用量子计算机可能在10-20年内出现

6.2 后量子密码学

为应对量子威胁,研究者开发了多种后量子密码算法:

  • 格密码:基于格中最短向量问题(SVP)和最近向量问题(CVP)的困难性
  • 基于哈希的签名:利用哈希函数的单向性构建签名方案
  • 多变量多项式:基于求解多变量非线性方程组的困难性
  • 基于编码的密码:利用解码随机线性码的困难性
  • 同态密码:支持对加密数据直接进行计算

NIST后量子密码标准化进程已选择多个候选算法,包括:

  • CRYSTALS-Kyber:格密码密钥封装机制(KEM)
  • CRYSTALS-Dilithium、FALCON和SPHINCS+:数字签名算法

6.3 算法过渡策略

组织应制定量子安全过渡计划:

  1. 密码敏捷性:设计支持快速算法更换的系统架构
  2. 混合方案:同时使用传统算法和后量子算法
  3. 风险评估:识别量子威胁下的关键资产和长期敏感数据
  4. 保持监控:跟踪量子计算进展和密码标准更新
  5. 早期采用:在非关键系统中试点后量子算法

6.4 永恒密钥问题与前向保密

应对"保存现在、破解未来"的威胁:

  • 实施前向保密机制:使用临时密钥,即使长期密钥泄露也不影响历史通信安全
  • 密钥限时:限制密钥使用时间,减少长期暴露风险
  • 数据生命周期管理:确定数据保护期限,超期数据安全销毁

七、总结与建议

基于不同场景的算法推荐:

  • 通用企业应用:RSA-2048或ECC P-256
  • 对性能敏感场景:优先选择ECC
  • 移动和物联网设备:ECC或轻量级后量子算法
  • 中国境内系统:遵循国密标准,使用SM2
  • 长期数据保护:考虑混合使用传统算法和后量子算法

定期评估密码系统安全性:

  • 密码算法及参数审查
  • 密钥管理流程评估
  • 实现安全性测试(包括侧信道分析)
  • 密码边界识别和保护
  • 加密文档与策略审查

密码学的真正目标不是创造隔离,而是在保障安全的前提下构建信任和连接。


附录:专业术语表

A

  • 非对称加密(Asymmetric Encryption):使用公钥和私钥对的加密系统
  • 认证(Authentication):验证身份或信息来源的过程

B

  • 区块链(Blockchain):使用密码学链接的分布式账本技术
  • 暴力攻击(Brute Force Attack):通过尝试所有可能的密钥值来破解加密

C

  • 密文(Ciphertext):经过加密的数据
  • 密码学(Cryptography):研究信息安全的科学
  • 证书(Certificate):包含公钥和身份信息的数字文档

D

  • 解密(Decryption):将密文转换回明文的过程
  • 数字签名(Digital Signature):验证消息来源和完整性的密码机制

E

  • 椭圆曲线密码学(Elliptic Curve Cryptography, ECC):基于椭圆曲线数学的加密方法
  • 加密(Encryption):将明文转换为密文的过程

F

  • 前向保密(Forward Secrecy):确保即使长期密钥泄露也不影响过去通信安全的属性

H

  • 哈希函数(Hash Function):将任意大小数据映射为固定大小值的单向函数
  • 硬件安全模块(Hardware Security Module, HSM):专用于密码操作的安全硬件设备

K

  • 密钥(Key):控制加密和解密操作的参数
  • 密钥长度(Key Length):密钥的位数,影响安全强度
  • 密钥管理(Key Management):生成、存储、分发和销毁密钥的流程

M

  • 明文(Plaintext):未加密的原始数据

N

  • 随机数(Nonce):只使用一次的随机值,用于防止重放攻击

O

  • OpenSSL:广泛使用的开源密码学工具包和库

P

  • 公钥(Public Key):可公开分享的密钥,用于加密或验证签名
  • 私钥(Private Key):需保密的密钥,用于解密或创建签名
  • 公钥基础设施(Public Key Infrastructure, PKI):管理数字证书的系统和流程

Q

  • 量子计算(Quantum Computing):利用量子力学原理进行计算的技术
  • 量子密码学(Quantum Cryptography):利用量子力学原理设计的密码系统

R

  • RSA:基于大整数分解难题的非对称加密算法
  • 随机数生成器(Random Number Generator):生成随机值的算法或设备

S

  • 签名(Signature):证明消息来源和完整性的加密结构
  • 侧信道攻击(Side-channel Attack):通过分析实现的物理特性破解密码系统
  • SM2:中国国家密码管理局发布的椭圆曲线公钥密码算法

T

  • 传输层安全(Transport Layer Security, TLS):保护网络通信的加密协议

Z

  • 零知识证明(Zero-knowledge Proof):证明者可以向验证者证明一个陈述是真实的,而不泄露除了该陈述为真之外的任何信息

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

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

相关文章

Pillow 玩图术:轻松获取图片尺寸和颜色模式

前言 在这个“图像为王”的时代,谁还敢说自己没被一张图折磨过?一张图片不讲武德,说崩就崩,说卡就卡,仿佛像素里藏着程序员的眼泪。不管你是网页设计师、AI炼丹师,还是只是想把猫片修得像艺术品,图片的尺寸和颜色模式都是你必须掌握的第一手情报。如果你不知道它有多宽…

下载core5compat 模块时,被禁止,显示 - servese replied: Forbbidden. -->换镜像源

怎么解决? --->换镜像源 方法 1:使用命令行参数指定镜像源 在运行 Qt 安装器时,通过 --mirror 参数指定镜像源: # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行为的好处 可以把复杂的界面逻辑抽象出去&#xff0c;让xaml的界面设计更简单&#xff0c;更清爽 1.安装包 Microsoft.Xaml.Behaviors.Wpf2.简单实现拖动效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趋势日报 (2025年05月03日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…

Oracle OCP认证考试考点详解083系列08

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 36. 第36题&#xff1a; 题目 解析及答案&#xff1a; 关于数据库闪回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象&#xff08;如表、索引、列等&#xff09;的元数据信息&#xff0c;帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍&#xff1a; 一、统计信息的分类 表统…

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求&#xff0c;dp[i]表示&#xff1a;到达i位置&#xff0c;一共有多少种方法 2、状态转移方程 以i位置的状态&#xff0c;以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后台管理系统模板

Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板&#xff0c;集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技术栈开…

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…

Python格式化字符串的四种方法

Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符&#xff0c;而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出&#xff1a;Hello, World!你可以使用多个占位符 注意&#xff1a;多个变量占位&#xff0c;变量要…

【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图&#xff1a; Redis最主要的用途&#xff0c;三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;redis最常用的场景&#xff09; 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说&#xff0c;通常情况下&#xff1…

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略&#xff1a;以数据为核心的交易思维 在动态交易市场中&#xff0c;如何在波动中捕捉相对确定的趋势&#xff0c;是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析&#xff0c;判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…

React useMemo函数

第一个参数是回调函数&#xff0c;返回计算的结果&#xff0c;第二个参数是依赖项&#xff0c;该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前&#xff0c;我们先来简单了解一下什么是通义灵码 Project Rules&#xff1f; 大家都知道&#xff0c;在使用 AI 代码助手的时候&#xff0c;有时候生成的代码不是自己想要的&#xff0c;或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置&#xff0c;使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句&#xff0c;提供了灵…