【加密与解密】【08】Java加密算法详解

文章目录

          • Java加密库
          • 摘要算法
          • MD5代码实现
          • SHA256代码实现
          • HmacMD5代码实现
          • CRC32代码实现
          • 对称加密算法
          • 查看JDK支持的算法
          • Base64代码实现
          • DES代码实现
          • DESede代码实现
          • AES代码实现
          • RC代码实现
          • IDEA代码实现
          • PBE代码实现
          • 非对称加密算法
          • DH秘钥交换算法数学原理
          • DH算法代码实现
          • RSA算法代码实现
          • DSA算法代码实现
          • ECC算法代码实现
          • 数字签名算法
          • 数字签名算法代码实现

Java加密库
  • JDK
  • Apache Commons Codec
  • Bouncy Castle
// commons codec
api("commons-codec:commons-codec:1.17.0")
// bouncy castle provider
api("org.bouncycastle:bcprov-jdk18on:1.71")
// register bouncy castle provider
Security.addProvider(BouncyCastleProvider())
// use bouncy castle provider
KeyGenerator.getInstance(algorithm, "BC")
Cipher.getInstance(algorithm, "BC")
摘要算法

常用的摘要算法有

  • MD,Message Digest,如MD5
  • MD5生成的摘要为128位,对应的十六进制字符串为32位
  • MD5已被破解,适合对安全性要求不高的场景,常用于校验文件
  • SHA,Secure Hash Algorithm,如SHA256
  • SHA256生成的摘要为256位,对应的十六进制字符串为64位
  • SHA256常用于数字签名,账号密码加密
  • SHA算法在MD算法的基础上演进而来,安全性更高
  • SHA1算法已被破解,SHA2未来也大概率会被破解,目前SHA2算法仍然是安全的
  • SHA2系列算法包括SHA224,SHA256,SHA384,SHA512
  • MAC,Message Authentication Code,消息认证码,也叫HMAC
  • MAC算法在MD或SHA的基础上,加入秘钥机制,即持有秘钥才能生成摘要
  • MAC可以和MD或SHA来组合使用,比如HmacMD5,HmacSHA256,生成的摘要程度为MD或SHA的长度
  • CRC,Cyclic Redundancy Check,循环冗余校验,如CRC32
  • CRC算法生成一个简短的摘要,放在原数据的结尾,一起发送给接收方
  • CRC算法多用于硬件和通信领域,一般用于校验数据完整性
  • CRC32生成的摘要为32位,对应的十六进制字符串为8位
  • JDK支持以上所有摘要算法的常用版本
MD5代码实现
import java.io.FileInputStream
import java.security.MessageDigest@OptIn(ExperimentalStdlibApi::class)
fun main() {val file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()val digest = MessageDigest.getInstance("MD5")val encrypted = digest.digest(origin)val md5 = encrypted.toHexString()println(md5)
}
SHA256代码实现

和MD5一样,只是algorithm不一样

val digest = MessageDigest.getInstance("SHA256")
HmacMD5代码实现
@OptIn(ExperimentalStdlibApi::class)
fun digestByMac() {val input = "Hello World".encodeToByteArray()// generate keyval generator = KeyGenerator.getInstance("HmacMD5")val key = generator.generateKey()// digest by macval mac = Mac.getInstance(key.algorithm)mac.init(key)val output = mac.doFinal(input)println(output.toHexString())// verify by macval spec = SecretKeySpec(key.encoded, key.algorithm)val verifyMac = Mac.getInstance(key.algorithm)verifyMac.init(spec)val verifyOutput = verifyMac.doFinal(input)println(verifyOutput.toHexString())
}
CRC32代码实现
import java.io.FileInputStream
import java.util.zip.CRC32@OptIn(ExperimentalStdlibApi::class)
fun main() {val file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()val crc32 = CRC32()crc32.update(origin)val checksum = crc32.value.toInt().toHexString()println(checksum)
}
对称加密算法

常用的对称加密算法有

  • Base64,将字节编码为Base64字符的一套算法
  • Base64不算严格意义上的对称加密,因为它没有秘钥,但是字符映射表间接充当了秘钥的角色
  • Base64字符仅包含大小写字母,数字,+,/,-,共64个字符
  • 由于Base64包含的都是基本字符,所以兼容性特别强,Base64主要用来解决数据传输过程中的编码问题,而不是加密
  • DES,最早规模化使用的加密算法
  • DES的密码较短,加密算法不完全公开,因此遭到安全性的质疑,并且存在安全漏洞
  • DESede,基于DES算法的三重迭代,来提升安全性,但同时也导致的加密效率较低的问题
  • AES,为了替代DES而诞生的一种算法
  • AES加密效率高,内存占用低,安全性高于DES算法,目前被广泛认可与应用
  • 并且,AES算法成为后来许多算法实现的主要参考模型
  • IDEA,International Data Encryption Algorithm,国际数据加密标准
  • IDEA算法早于AES,作为DES的替代算法出现
  • IDEA不是基于DES的改良而产生的,而是完全独创了一套新的算法
  • IDEA不是在美国发展起来的算法,没有遭到法律出口限制,在使用范围上更加灵活
  • 电子邮件加密协议PGP,即是使用了IDEA算法
  • RC,Rivest Cipher,AES同时代的竞争方案之一
  • Twofish,AES同时代的竞争方案之一,前身是Blowfish
  • PBE,Password Baed Encryption,基于口令的加密算法
  • PBE采用随机数,再拼凑多重加密的方式,来保证数据的安全性
  • 作为口令的随机数被称作为盐(Salt),同一个随机数不能被使用两次
  • 盐在固定秘钥的基础上引入了变数,这样就加大了破解难度
  • PBE是一个综合性算法,加密过程会用到其它算法,比如PBEWithMD5AndDES
  • JDK支持DES,AES,Blowfish,RC,PBE算法
查看JDK支持的算法
Security.getAlgorithms("KeyGenerator")
Security.getAlgorithms("KeyPairGenerator")
Security.getAlgorithms("Cipher")
Security.getAlgorithms("Signature")
Base64代码实现
import java.io.FileInputStream
import java.util.Base64fun main() {val file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// encode bytes to base64 stringval encoder = Base64.getEncoder()val encoded = encoder.encodeToString(origin)println(encoded)// decode base64 string to bytesval decoder = Base64.getDecoder()val decoded = decoder.decode(encoded)println(String(decoded))
}
DES代码实现
import java.io.FileInputStream
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.spec.SecretKeySpec@OptIn(ExperimentalStdlibApi::class)
fun main() {val algorithm = "DES"// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate encrypt keyval generator = KeyGenerator.getInstance(algorithm)val secretKey = generator.generateKey()// encryptval cipher1 = Cipher.getInstance(algorithm)cipher1.init(Cipher.ENCRYPT_MODE, secretKey)val encrypted = cipher1.doFinal(origin)// generate decrypt keyval keySpec = SecretKeySpec(secretKey.encoded, algorithm)// decryptval cipher2 = Cipher.getInstance(algorithm)cipher2.init(Cipher.DECRYPT_MODE, keySpec)val decrypted = cipher2.doFinal(encrypted)println(decrypted.toHexString() == origin.toHexString())
}
DESede代码实现

和DES完全一致,算法名称改为DESedeTripleDES即可

AES代码实现

和DES完全一致,算法名称改为AES即可

RC代码实现

和DES完全一致,算法名称改为RC2即可

IDEA代码实现

JDK没有提供IDEA算法的实现,此时就轮到Bouncy Castle出场了

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.Security
import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.spec.SecretKeySpec@OptIn(ExperimentalStdlibApi::class)
fun main() {val provider = "BC"val keyAlgorithm = "IDEA"val cipherAlgorithm = "IDEA"// register bouncy castle providerSecurity.addProvider(BouncyCastleProvider())// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate encrypt keyval generator = KeyGenerator.getInstance(keyAlgorithm, provider)val secretKey = generator.generateKey()// encryptval cipher1 = Cipher.getInstance(cipherAlgorithm, provider)cipher1.init(Cipher.ENCRYPT_MODE, secretKey)val encrypted = cipher1.doFinal(origin)// generate decrypt keyval keySpec = SecretKeySpec(secretKey.encoded, keyAlgorithm)// decryptval cipher2 = Cipher.getInstance(cipherAlgorithm, provider)cipher2.init(Cipher.DECRYPT_MODE, keySpec)val decrypted = cipher2.doFinal(encrypted)println(decrypted.toHexString() == origin.toHexString())
}
PBE代码实现

PBE是加盐算法,因此需要用到密码和盐两个参数来加解密

import java.io.FileInputStream
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.PBEKeySpec
import javax.crypto.spec.PBEParameterSpec@OptIn(ExperimentalStdlibApi::class)
fun main() {val keyAlgorithm = "PBEWithMD5AndDES"val cipherAlgorithm = "PBEWithMD5AndDES"val password = "123456"val salt = SecureRandom().generateSeed(8)// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate secret keyval keySpec = PBEKeySpec(password.toCharArray())val keyFactory = SecretKeyFactory.getInstance(keyAlgorithm)val secretKey = keyFactory.generateSecret(keySpec)// encryptval algorithmSpec = PBEParameterSpec(salt, 100)val cipher1 = Cipher.getInstance(cipherAlgorithm)cipher1.init(Cipher.ENCRYPT_MODE, secretKey, algorithmSpec)val encrypted = cipher1.doFinal(origin)// decryptval cipher2 = Cipher.getInstance(cipherAlgorithm)cipher2.init(Cipher.DECRYPT_MODE, secretKey, algorithmSpec)val decrypted = cipher2.doFinal(encrypted)println(decrypted.toHexString() == origin.toHexString())
}
非对称加密算法

常用的非对称加密算法有

  • DH算法,Diffie Hellman
  • DH算法基于离散对数的数学基础,通过模运算和幂运算实现秘钥交换
  • DH算法只能用于秘钥交换,不能用于数据解密
  • DH算法最早的非对称加密算法,为非对称加密算法奠定了理论基础
  • 几乎所有的非对称加密算法,都是基于数学问题的求解来设计的
  • RSA算法,Rivest Shamir Adleman
  • RSA算法基于大数因子分解问题
  • RSA算法技能既能用于数据加密,也能用于数字签名
  • RAS算法是应用范围最为广泛的非对称加密算法
  • RSA虽然能用于数据加密,但由于性能原因,只允许加密245字节以内的数据
  • 因此RSA的主流用法,还是用于数字签名
  • DSA算法,Digital Signature Algorithm
  • DSA算法基于离散对数问题
  • DSA算法的前身是ElGamal算法
  • DSA算法主要用于数字签名
  • DSA算法的私钥,不能解密公钥加密的数据,因此不具备完整加密功能
  • ECC算法,Elliptical Curve Cryptography
  • ECC算法基于椭圆曲线问题
  • ECC秘钥生成速度比RSA快,安全性也比RSA高,硬件占用比RSA低,但是普及度没RSA广
  • ECC算法技能既能用于数据加密,也能用于数字签名
  • ECC算法用于加密时,只允许公钥加密,私钥解密
  • ECDH算法,借鉴ECC算法改良的DH算法
  • ECDH算法沿用DH算法的思路,但基于ECC椭圆曲线问题来实现
  • ECDSA算法,借鉴ECC算法改良的DSA算法
  • JDK支持支持RSA和DSA算法
DH秘钥交换算法数学原理

DH秘钥交换算法,是一个通过公钥私钥,来协商对称秘钥的一种算法

  • 参数g,p是算法共享参数,所有人都知道
  • publicA = g^privateA mod p
  • publicB = g^privateB mod p
  • shareA = publicB^privateA mod p
  • shareB = publicA^privateB mod p
  • 通过数学理论可以论证,shareA==shareB
  • 因此可以使用shareA和shareB作为AB通信时的SecretKey
  • 由于shareA和shareB的生成依赖于自己的私钥和对方的公钥,对每个人都不一样,并且不存在网络交换过程,因为是安全的
DH算法代码实现

DH算法主要借助KeyAgreement类来实现

KeyAgreement是一个秘钥协商工具类,用于交换公钥,以生成相同的对称秘钥

@OptIn(ExperimentalStdlibApi::class)
fun swapSecretKey() {System.setProperty("jdk.crypto.KeyAgreement.legacyKDF", "true")val generator = KeyPairGenerator.getInstance("DH")val keyPair1 = generator.genKeyPair()val keyPair2 = generator.genKeyPair()val agreement = KeyAgreement.getInstance(generator.algorithm)agreement.init(keyPair1.private)agreement.doPhase(keyPair2.public, true)val secretKey1 = agreement.generateSecret("AES")agreement.init(keyPair2.private)agreement.doPhase(keyPair1.public, true)val secretKey2 = agreement.generateSecret("AES")println(secretKey1.encoded.toHexString(HexFormat.UpperCase))println(secretKey2.encoded.toHexString(HexFormat.UpperCase))
}
RSA算法代码实现
import java.io.FileInputStream
import java.security.KeyPairGenerator
import javax.crypto.Cipher@OptIn(ExperimentalStdlibApi::class)
fun main() {val keyAlgorithm = "RSA"val cipherAlgorithm = "RSA"// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes().copyOf(245)// generate key pairval keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm)val keyPair = keyGenerator.genKeyPair()// encryptval cipher1 = Cipher.getInstance(cipherAlgorithm)cipher1.init(Cipher.ENCRYPT_MODE, keyPair.private)val encrypted = cipher1.doFinal(origin)// decryptval cipher2 = Cipher.getInstance(cipherAlgorithm)cipher2.init(Cipher.DECRYPT_MODE, keyPair.public)val decrypted = cipher2.doFinal(encrypted)println(decrypted.toHexString() == origin.toHexString())
}
DSA算法代码实现

DSA不能用于加密,只能用于签名

用于签名时,必须要配合Signature使用,不能直接使用Cipher

虽然说,签名的实质就是对摘要进行加密,但是Cipher类的定位是数据加密,因此并不支持DSA算法

import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Signaturefun main() {val keyAlgorithm = "DSA"val signAlgorithm = "SHA256withDSA"// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate key pairval keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm)val keyPair = keyGenerator.genKeyPair()// signval sign = Signature.getInstance(signAlgorithm)sign.initSign(keyPair.private)sign.update(origin)val signature = sign.sign()// verifyval verify = Signature.getInstance(signAlgorithm)verify.initVerify(keyPair.public)verify.update(origin)val result = verify.verify(signature)println(result)
}
ECC算法代码实现

ECC用于加密时,需要借助Bouncy Castle来实现

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Security
import javax.crypto.Cipher@OptIn(ExperimentalStdlibApi::class)
fun main() {val provider = "BC"val keyAlgorithm = "ECIES"val cipherAlgorithm = "ECIES"// register bouncy castle providerSecurity.addProvider(BouncyCastleProvider())// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate key pairval keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm, provider)val keyPair = keyGenerator.genKeyPair()// encryptval cipher1 = Cipher.getInstance(cipherAlgorithm, provider)cipher1.init(Cipher.ENCRYPT_MODE, keyPair.public)val encrypted = cipher1.doFinal(origin)// decryptval cipher2 = Cipher.getInstance(cipherAlgorithm, provider)cipher2.init(Cipher.DECRYPT_MODE, keyPair.private)val decrypted = cipher2.doFinal(encrypted)println(decrypted.toHexString() == origin.toHexString())
}

ECC用于签名时,必须要配合Signature使用,不能直接使用Cipher加密摘要

Cipher在进行数据加密时,会对公钥私钥格式进行检测,避免用户乱用

import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.io.FileInputStream
import java.security.KeyPairGenerator
import java.security.Security
import java.security.Signaturefun main() {val provider = "BC"val keyAlgorithm = "ECIES"val signAlgorithm = "SHA256withECDSA"// register bouncy castle providerSecurity.addProvider(BouncyCastleProvider())// create test dataval file = "resources/data.txt"val origin = FileInputStream(file).readAllBytes()// generate key pairval keyGenerator = KeyPairGenerator.getInstance(keyAlgorithm, provider)val keyPair = keyGenerator.genKeyPair()// signval sign = Signature.getInstance(signAlgorithm, provider)sign.initSign(keyPair.private)sign.update(origin)val signature = sign.sign()// verifyval verify = Signature.getInstance(signAlgorithm, provider)verify.initVerify(keyPair.public)verify.update(origin)val result = verify.verify(signature)println(result)
}
数字签名算法

数字签名包含两步,第一步是生成摘要,第二步是对摘要进行加密

所以数字签名算法,即是摘要算法和非对称加密算法的组合,常见的组合有

MD5withRSA,SHA256withRSA,SHA256withDSA,SHA256withECDSA

数字签名算法代码实现

数字签名有专门的工具类Signature,不需要我们手动去摘要再加密

上面两节,在介绍DSA和ECC时,已经展示了其用于签名时的使用方式

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

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

相关文章

【python全栈系列】day03-python数据类型-Number

python3中有六个标准的数据类型:Number(数字)String(字符串)List(列表) Tuple(元组) Set(集合)Dictionary(字典) 下面我们就用几天的…

学会python——用python编写一个电子时钟(python实例十七)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.电子时钟程序 3.1 代码构思 3.2代码实例 3.3运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性…

thinkphp8 执行 db:: 需要引入什么

在ThinkPHP8中,执行数据库操作需要使用Db类。为了执行Db::静态调用,您需要引入think\facade\Db类。 在您的控制器或模型文件顶部,使用以下代码引入Db类: use think\facade\Db; 然后您就可以使用Db类来执行数据库操作,…

【Python】从Word文档中提取表格的方法

在Python中,从Word文档(通常是.doc或.docx格式)中提取表格可以使用第三方库,如python-docx。以下是使用python-docx库从Word文档中提取表格的基本步骤: 安装python-docx库: 如果你还没有安装这个库&#xf…

今天的A股,让人惊愕了,2个耐人寻味的重要信号,有望迎来下一个超级风口!

今天的A股,让人惊愕了,你知道是为什么吗?盘面上出现2个耐人寻味的重要信号,有望迎来下一个超级风口! 1、今天两市低开低走,但大消费劲头十足,连中免这样的大体量都涨停了,另外消费茅…

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…

SaaS运营:如何根据“客户漏斗”定制合作伙伴营销策略?

将你的合作伙伴营销策略与你的客户漏斗模型相结合&#xff0c;可以显著提升你的营销效果。通过瞄准客户旅程中的每一个阶段&#xff0c;你可以增加客户参与度并推动转化&#xff0c;从而将你的促销活动提升到新的高度——这仅仅是一个以数据为支撑的方法。 为了探讨如何在漏斗…

数据结构 - C/C++ - 树

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 树的概念 结构特性 树的样式 树的存储 树的遍历 节点增删 二叉搜索树 平衡二叉树 树的概念 二叉树是树形结构&#xff0c;是一种非线性结构。 非线性结构&#xff1a;在二叉树中&#x…

Echarts热力图关闭初始化时动画效果(由左至右渐进加载动画)

Echarts热力图关闭初始化时动画效果&#xff08;由左至右渐进加载动画&#xff09; 在Echarts配置中&#xff0c;热力图初始时加载数据会有由左向右的渐进的加载动画。无论是在option或在series添加均不生效&#xff0c;但是在折线图会生效。 animation animationDuration ani…

C/C++ 编程语言详解

前言 C 和 C 是两种功能强大且广泛使用的编程语言。C 语言因其高效、灵活和接近硬件的特性&#xff0c;在系统编程、嵌入式系统和高性能计算中占据重要地位。C 则在 C 的基础上增加了面向对象编程特性&#xff0c;广泛应用于软件开发、游戏编程和大型系统设计。本文将详细介绍…

LLM应用:传统NLP任务

LLM出来以后&#xff0c;知乎上就出现了“传统NLP已死”的言论&#xff0c;但是传统NLP真的就被扔进历史的垃圾桶了吗&#xff1f; 其实&#xff0c;尽管LLM具有出色的通用能力&#xff0c;但仍然无法有效应对低资源领域的自然语言处理任务&#xff0c;如小语种翻译。为了更好地…

golang——Gin框架及路由介绍

一. 框架介绍 Gin是一个轻量级的Go语言Web框架&#xff0c;它具有高性能和简洁的设计。由于其快速的路由匹配和处理性能&#xff0c;Gin成为Go语言中最受欢迎的Web框架之一。 特点&#xff1a; 快速和轻量&#xff1a;Gin框架的设计注重性能和效率&#xff0c;采用了一些优化措…

quartz调度框架和gbase8s适配过程中的四个报错

1.报错Caused by: java,sql.SOLException Create breakpoint . : 发生语法错误。 程序与数据库通过jdbc连接时&#xff0c;为了保持连接&#xff0c;会向数据库发送sql语句验证连接有效 --如mysql的其他数据库 connection-test-query: "select 1;" --gbase8s数据库…

第二十一章 网络编程

​ 一、网络的相关概念 1. 网络通信 &#xff08;1&#xff09;网络通信&#xff1a;将 数据 通过网络从一台设备传输到另一台设备 &#xff08;2&#xff09;java.net 包下提供了一系列的类或接口&#xff0c;完成网络通信 2. 网络 概念&#xff1a;两台或多台设备通过一定…

轻松省电!教你苹果手机自动调节亮度怎么设置

在日常使用手机的过程中&#xff0c;屏幕亮度是影响电池续航的关键因素之一。苹果手机提供的自动调节亮度功能&#xff0c;可以根据环境光线自动调整屏幕亮度&#xff0c;从而提供最佳的视觉体验并有效延长电池使用时间。想知道苹果手机自动调节亮度怎么设置吗&#xff1f; 本…

工厂自动化相关设备工业一体机起到什么作用?

在当今的制造业领域&#xff0c;工厂自动化已成为提高生产效率、保证产品质量和降低成本的关键。在这一进程中&#xff0c;工业一体机作为一种重要的设备&#xff0c;发挥着不可或缺的作用。 工业一体机是自动化生产线上的控制中心。它能够整合和处理来自各个传感器、执行器和其…

02:vim的使用和权限管控

vim的使用 1、vim基础使用1.1、vim pathname 2、vim高级用法2.1、查找2.2、设置显示行号2.3、快速切换行2.4、 行删除2.5、行复制粘贴 3、权限管理3.1、普通用户和特权用户3.2、文件权限表示 vim是Linux中的一种编辑器&#xff0c;类似于window中的记事本&#xff0c;可以对创建…

函数式编程和命令式编程

函数式编程&#xff08;Functional Programming, FP&#xff09;与命令式编程&#xff08;Imperative Programming, IP&#xff09;是编程领域中两大截然不同的范式&#xff0c;它们在解决问题的策略和哲学上存在着本质的差异。 函数式编程&#xff08;Functional Programming…

python解耦重构,提高程序维护性

一、重构思想 思路来源 java spring设计模式学习&#xff0c;强调低耦合的思想&#xff0c;通过解耦来提高程序的可维护性。 二、代码重构 解决方案 通过单独配置文件来控制变量的改变。 spring的话可以读取xml或者是springboot 读取application.properties 来获取变量值。…

产业链协同,共谋产业新高度

国际数字影像产业园始终秉承“产业协同&#xff0c;共谋发展”的核心理念&#xff0c;致力于通过深化产业链上下游的紧密合作&#xff0c;推动数字影像产业的持续繁荣。 一、产业协同的具体实践 1、产业链整合&#xff1a;园区积极整合数字影像产业的上下游资源&#xff0c;形…