【安全】加密算法原理与实战
为了理解SSL/TLS原理,大家需要掌握一些加密算法的基础知识。当然,这不是为了让大家成为密码学专家,所以只需对基础的加密算法有一些了解即可。基础的加密算法主要有哈希(Hash,或称为散列)、对称加密(Symmetric Cryptography)、非对称加密(Asymmetric Cryptography)、数字签名(Digital Signature)。
哈希单向加密算法原理与实战
哈希算法(或称为散列算法)比较简单,就是为待加密的任意大小的信息(如字符串)生成一个固定大小(比如通过MD5加密之后是32个字符)的字符串摘要。常用的哈希算法有MD5、SHA1、SHA-512等。哈希是不可逆的加密技术,一些数据一旦通过哈希转换为其他形式,源数据将永远无法恢复。
在哪些场景下使用哈希加密呢?一般来说,在用户注册的时候,服务端保存用户密码的时候会将明文密码的哈希密码存储在数据库中,而不是直接存储用户的明文密码。当用户下次登录时,会对用户的登入密码(明文)使用相同的哈希算法进行处理,并将哈希结果与来自数据库的哈希密码进行匹配,如果是相同的,那么用户将登录成功,否则用户将登录失败。
哈希加密也称为单向哈希加密,是通过对不同输入长度的信息进行哈希计算得到固定长度的输出,是单向、不可逆的。所以,即使保存用户密码的数据库被攻击,也不会造成用户的密码泄漏。
最常见的哈希算法为MD5(Message-Digest Algorithm 5,信息-摘要算法5),也是计算机广泛使用的哈希算法之一。主流编程语言普遍都提供MD5实现,MD5的前身有MD2、MD3和MD4。
MD5将输入的不定长度信息经过程序流程生成四个32位(Bit)数据,最后联合起来输出一个固定长度128位的摘要,基本处理流程包括求余、取余、调整长度、与链接变量进行循环运算等,最终得出结果。
除了MD5, Java还提供了SHA1、SHA256、SHA512等哈希摘要函数的实现。除了在算法上有些差异之外,这些哈希函数的主要不同在于摘要长度,MD5生成的摘要是128位,SHA1生成的摘要是160位,SHA256生成的摘要是256位,SHA512生成的摘要是512位。
SHA-1与MD5的最大区别在于其摘要比MD5摘要长32位(相当于长4字节,转换十六进制后比MD5多8个字符)。对SHA-1强行攻击的强度比对MD5攻击的强度要大。但是SHA-1哈希过程的循环步骤比MD5多,且需要的缓存大,因此SHA-1的运行速度比MD5慢。
以下代码使用Java提供的MD5、SHA1、SHA256、SHA512等哈希摘要函数生成哈希摘要(哈希加密结果)并进行验证的案例:
//省略import
public class HashCrypto
{/*** 哈希单向加密测试用例*/public static String encrypt(String plain){StringBuffer md5Str = new StringBuffer(32);try{/*** MD5*///MessageDigest md = MessageDigest.getInstance("MD5");/*** SHA-1*///MessageDigest md = MessageDigest.getInstance("SHA-1");/*** SHA-256*///MessageDigest md = MessageDigest.getInstance("SHA-256");/*** SHA-512*/MessageDigest md = MessageDigest.getInstance("SHA-512");String charset = "UTF-8";byte[] array = md.digest(plain.getBytes(charset));for (int i = 0; i < array.length; i++){//转成十六进制字符串String hexString = Integer.toHexString((0x000000FF & array[i]) | 0xFFFFFF00);log.debug("hexString: {}, 第6位之后: {}",hexString, hexString.substring(6));md5Str.append(hexString.substring(6));}} catch (Exception ex){ex.printStackTrace();}return md5Str.toString();}public static void main(String[] args){//原始的明文字符串,也是需要加密的对象String plain = "123456";//使用哈希函数加密String cryptoMessage = HashCrypto.encrypt(plain);log.info("cryptoMessage:{}", cryptoMessage);//验证String cryptoMessage2 = HashCrypto.encrypt(plain);log.info("验证 {},\n是否一致:{}", cryptoMessage2,cryptoMessage.equals(cryptoMessage2));//验证2String plainOther = "654321";String cryptoMessage3 = HashCrypto.encrypt(plainOther);log.info("验证 {},\n是否一致:{}", cryptoMessage3,cryptoMessage.equals(cryptoMessage3));}
}
对称加密算法原理与实战
对称加密(Symmetric Cryptography)指的是客户端自己封装一种加密算法,将给服务端发送的数据进行加密,并且将数据加密的方式(密钥)发送给密文,服务端收到密钥和数据,用密钥进行解密。
对称加密:使用同一个密钥加密和解密,优点是速度快;但是它要求共享密钥,缺点是密钥管理不方便、容易泄露。
常见的对称加密算法有DES、AES等。DES加密算法出自IBM的数学研究,被美国政府正式采用之后开始广泛流传,但是近些年来使用越来越少,因为DES使用56位密钥,以现代计算能力24小时内即可被破解。虽然如此,但是在对安全要求不高的应用中,还是可以使用DES加密算法。
下面是一段使用Java语言编写的进行DES加密的演示代码:
//省略import
public class DESCrypto
{/*** 对称加密*/public static byte[] encrypt(byte[] data, String password) {try{SecureRandom random = new SecureRandom();//使用密码,创建一个密钥描述符DESKeySpec desKey = new DESKeySpec(password.getBytes());//创建一个密钥工厂,然后用它把 DESKeySpec 密钥描述符实例转换成密钥SecretKeyFactory keyFactory =SecretKeyFactory.getInstance("DES");//通过密钥工程生成密钥SecretKey secretKey = keyFactory.generateSecret(desKey);//Cipher对象实际完成加密操作Cipher cipher = Cipher.getInstance("DES");//用密钥初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);//为数据执行加密操作return cipher.doFinal(data);}catch(Throwable e){e.printStackTrace();}return null;}/*** 对称解密*/public static byte[] decrypt(byte[] cryptData,String password) …{//DES算法要求有一个可信任的随机数源SecureRandom random = new SecureRandom();//创建一个 DESKeySpec 密钥描述符对象DESKeySpec desKey = new DESKeySpec(password.getBytes());//创建一个密钥工厂SecretKeyFactory keyFactory =SecretKeyFactory.getInstance("DES");//将 DESKeySpec 对象转换成 SecretKey 对象SecretKey secretKey = keyFactory.generateSecret(desKey);//Cipher对象实际完成解密操作Cipher cipher = Cipher.getInstance("DES");//用密钥初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey, random);//真正开始解密操作return cipher.doFinal(cryptData);}public static void main(String args[]) {//待加密内容String str = "123456";//密码长度要是8的倍数String password = "12345678";byte[] result = DESCrypto.encrypt(str.getBytes(),password);log.info("str:{} 加密后:{}",str,new String(result));//直接将如上内容解密try {byte[] decryResult = DESCrypto.decrypt(result, password);log.info("解密后:{}",new String(decryResult));} catch (Exception e1) {e1.printStackTrace();}}
}
非对称加密算法原理与实战
非对称加密算法(Asymmetric Cryptography)又称为公开密钥加密算法,需要两个密钥:一个称为公开密钥(公钥);另一个称为私有密钥(私钥)。公钥与私钥需要配对使用,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果使用私钥对数据加密,那么需要用对应的公钥才能解密。由于加解密使用不同的密钥,因此这种算法为非对称加密算法。
非对称加密算法的优点是密钥管理很方便,缺点是速度慢。典型的非对称加密算法有RSA、DSA等。
下面是一段使用Java代码进行RSA加密的演示代码:
//省略import
/*** RSA 非对称加密算法*/
@Slf4j
public class RSAEncrypt
{/*** 指定加密算法为RSA*/private static final String ALGORITHM = "RSA";/*** 常量,用来初始化密钥长度*/private static final int KEY_SIZE = 1024;/*** 指定公钥存放文件*/private static final String PUBLIC_KEY_FILE =SystemConfig.getKeystoreDir() + "/PublicKey";/*** 指定私钥存放文件*/private static final String PRIVATE_KEY_FILE =SystemConfig.getKeystoreDir() + "/PrivateKey";/*** 生成密钥对*/protected static void generateKeyPair() throws Exception{/*** 为RSA算法创建一个KeyPairGenerator对象*/KeyPairGenerator keyPairGenerator =KeyPairGenerator.getInstance(ALGORITHM);/*** 利用上面的密钥长度初始化这个KeyPairGenerator对象*/keyPairGenerator.initialize(KEY_SIZE);/** 生成密钥对 */KeyPair keyPair = keyPairGenerator.generateKeyPair();/** 得到公钥 */PublicKey publicKey = keyPair.getPublic();/** 得到私钥 */PrivateKey privateKey = keyPair.getPrivate();ObjectOutputStream oos1 = null;ObjectOutputStream oos2 = null;try{log.info("生成公钥和私钥,并且写入对应的文件");File file = new File(PUBLIC_KEY_FILE);if (file.exists()){log.info("公钥和私钥已经生成,不需要重复生成,path:{}", PUBLIC_KEY_FILE);return;}/** 用对象流将生成的密钥写入文件 */log.info("PUBLIC_KEY_FILE 写入:{}", PUBLIC_KEY_FILE);oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));log.info("PRIVATE_KEY_FILE 写入:{}", PRIVATE_KEY_FILE);oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));oos1.writeObject(publicKey);oos2.writeObject(privateKey);} catch (Exception e){throw e;} finally{/** 清空缓存,关闭文件输出流 */IOUtil.closeQuietly(oos1);IOUtil.closeQuietly(oos2);}}/*** 加密方法,使用公钥加密* @param plain 明文数据*/public static String encrypt(String plain) throws Exception{//从文件加载公钥Key publicKey = loadPublicKey();/** 得到Cipher对象,来实现对源数据的RSA加密 */Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] b = plain.getBytes();/** 执行加密操作 */byte[] b1 = cipher.doFinal(b);BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(b1);}/*** 从文件加载公钥*/public static PublicKey loadPublicKey() throws Exception{PublicKey publicKey=null;ObjectInputStream ois = null;try{log.info("PUBLIC_KEY_FILE 读取:{}", PUBLIC_KEY_FILE);/** 读出文件中的公钥 */ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));publicKey = (PublicKey) ois.readObject();} catch (Exception e){throw e;} finally{IOUtil.closeQuietly(ois);}return publicKey;}//方法:对密文解密,使用私钥解密public static String decrypt(String crypto) throws Exception{PrivateKey privateKey = loadPrivateKey();/** 得到Cipher对象,对已用公钥加密的数据进行RSA解密 */Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);BASE64Decoder decoder = new BASE64Decoder();byte[] b1 = decoder.decodeBuffer(crypto);/** 执行解密操作 */byte[] b = cipher.doFinal(b1);return new String(b);}/*** 从文件加载私钥* @throws Exception*/public static PrivateKey loadPrivateKey() throws Exception{PrivateKey privateKey;ObjectInputStream ois = null;try{log.info("PRIVATE_KEY_FILE 读取:{}", PRIVATE_KEY_FILE);/** 读出文件中的私钥 */ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));privateKey = (PrivateKey) ois.readObject();} catch (Exception e){e.printStackTrace();throw e;} finally{IOUtil.closeQuietly(ois);}return privateKey;}public static void main(String[] args) throws Exception{//生成密钥对generateKeyPair();//待加密内容String plain = "123";//公钥加密String dest = encrypt(plain);log.info("{} 使用公钥加密后:\n{}", plain, dest);//私钥解密String decrypted = decrypt(dest);log.info(" 使用私钥解密后:\n{}", decrypted);}
}
非对称加密算法包含两种密钥,其中的公钥本来是公开的,不需要像对称加密算法那样将私钥给对方,对方解密时使用公开的公钥即可,大大地提高了加密算法的安全性。退一步讲,即使不法之徒获知了非对称加密算法的公钥,甚至获知了加密算法的源码,只要没有获取公钥对应的私钥,也是无法进行解密的。
数字签名原理与实战
数字签名(Digital Signature)是确定消息发送方身份的一种方案。在非对称加密算法中,发送方A通过接收方B的公钥将数据加密后的密文发送给接收方B, B利用私钥解密就得到了需要的数据。这里还存在一个问题,接收方B的公钥是公开的,接收方B收到的密文都是使用自己的公钥加密的,那么如何检验发送方A的身份呢?
一种非常简单的检验发送方A身份的方法为:发送方A可以利用A自己的私钥进行消息加密,然后B利用A的公钥来解密,由于私钥只有A知道,接收方只要解密成功,就可以确定消息来自A而不是其他地方。
数字签名的原理就基于此,通常为了证明发送数据的真实性,利用发送方的私钥对待发送的数据生成数字签名。
数字签名的流程比较简单,首先通过哈希函数为待发数据生成较短的消息摘要,然后利用私钥加密该摘要,所得到的摘要密文基本上就是数字签名。发送方A将待发送数据以及数字签名一起发送给接收方B,接收方B收到之后使用A的公钥校验数字签名,如果校验成功,就说明内容来自发送方A,否则为非法内容。
数字签名的大致流程如图12-7所示。
Java为数字签名提供了良好的支持,java.security.Signature接口提供了数字签名的基本操作API, Java规范要求各JDK版本需要提供表12-2中所列出的标准签名实现。
下面是一段使用JSHA512withRSA算法实现数字签名的Java演示代码:
package com.crazymakercircle.secure.crypto;
//省略import
/*** RSA签名演示*/
@Slf4j
public class RSASignDemo
{/*** RSA签名** @param data 待签名的字符串* @param priKey RSA私钥字符串* @return 签名结果* @throws Exception 签名失败则抛出异常*/public byte[] rsaSign(byte[] data, PrivateKey priKey)throws SignatureException{try{Signature signature = Signature.getInstance("SHA512withRSA");signature.initSign(priKey);signature.update(data);byte[] signed = signature.sign();return signed;} catch (Exception e){throw new SignatureException("RSAcontent = " + data+ "; charset = ", e);}}/*** RSA验签* @param data 被签名的内容* @param sign 签名后的结果* @param pubKey RSA公钥* @return 验签结果*/public boolean verify(byte[] data, byte[] sign, PublicKey pubKey)throws SignatureException{try{Signature signature = Signature.getInstance("SHA512withRSA");signature.initVerify(pubKey);signature.update(data);return signature.verify(sign);} catch (Exception e){e.printStackTrace();throw new SignatureException("RSA验证签名[content = " + data+"; charset = " + "; signature = " + sign + "]发生异常!", e);}}/*** 私钥*/private PrivateKey privateKey;/*** 公钥*/private PublicKey publicKey;/*** 加密过程* @param publicKey 公钥* @param plainTextData 明文数据* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(PublicKey publicKey, byte[] plainTextData)throws Exception{if (publicKey == null){throw new Exception("加密公钥为空, 请设置");}Cipher cipher = null;try{cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e){throw new Exception("无此加密算法");}…}/*** 解密过程* @param privateKey 私钥* @param cipherData 密文数据* @return 明文* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(PrivateKey privateKey, byte[] cipherData)…{if (privateKey == null){throw new Exception("解密私钥为空, 请设置");}Cipher cipher = null;try{cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e){throw new Exception("无此解密算法");}…}/*** Main 测试方法* @param args*/public static void main(String[] args) throws Exception{RSASignDemo RSASignDemo = new RSASignDemo();//加载公钥RSASignDemo.publicKey = RSAEncrypt.loadPublicKey();//加载私钥RSASignDemo.privateKey = RSAEncrypt.loadPrivateKey();//测试字符串String sourceText = "12312";try{log.info("加密前的字符串为:{}", sourceText);//公钥加密byte[] cipher = RSASignDemo.encrypt(RSASignDemo.publicKey, sourceText.getBytes());//私钥解密byte[] decryptText = RSASignDemo.decrypt(RSASignDemo.privateKey, cipher);log.info("私钥解密的结果是:{}", new String(decryptText));//字符串生成签名byte[] rsaSign = RSASignDemo.rsaSign(sourceText.getBytes(), RSASignDemo.privateKey);//签名验证Boolean succeed = RSASignDemo.verify(sourceText.getBytes(),rsaSign, RSASignDemo.publicKey);log.info("字符串签名为:\n{}", byteToHex(rsaSign));log.info("签名验证结果是:{}", succeed);String fileName =IOUtil.getResourcePath("/system.properties");byte[] fileBytes = readFileByBytes(fileName);//文件签名验证byte[] fileSign =RSASignDemo.rsaSign(fileBytes, RSASignDemo.privateKey);log.info("文件签名为:\n{}" , byteToHex(fileSign));//文件签名保存String signPath =SystemConfig.getKeystoreDir() + "/fileSign.sign";ByteUtil.saveFile(fileSign,signPath );Boolean verifyOK = RSASignDemo.verify(fileBytes, fileSign, RSASignDemo.publicKey);log.info("文件签名验证结果是:{}", verifyOK);//读取验证文件byte[] read = readFileByBytes(signPath);log.info("读取文件签名:\n{}" , byteToHex(read));verifyOK= RSASignDemo.verify(fileBytes, read, RSASignDemo.publicKey);log.info("读取文件签名验证结果是:{}", verifyOK);} catch (Exception e){System.err.println(e.getMessage());}}
}
相关文章:
【安全】加密算法原理与实战
为了理解SSL/TLS原理,大家需要掌握一些加密算法的基础知识。当然,这不是为了让大家成为密码学专家,所以只需对基础的加密算法有一些了解即可。基础的加密算法主要有哈希(Hash,或称为散列)、对称加密(Symm…...
STM32STM8芯片擦除与读保护
连接STM单片机与断开单片机连接, 点击擦除就可以了。 文件选HEX在选择Verify进行下载。...
Qwen2.5技术报告阅读
论文概述 ⸻ 🧠 1. 模型概述 Qwen2.5 是阿里巴巴推出的一系列大语言模型(LLMs),在 预训练数据量 和 后训练方法 上都比前一代 Qwen2 有了显著提升。 ⸻ 📈 2. 模型特点 • 预训练数据量提升:从 7 万亿…...
HDCP(二)
HDCP加密算法实现详解 HDCP(高带宽数字内容保护)的加密算法实现涉及对称加密、密钥派生、动态同步机制等核心环节,其设计兼顾实时性与安全性。以下从算法类型、流程实现、硬件集成等角度展开分析: 1. 加密算法类型与版本差异 •…...
POSIX线程(pthread)库:线程的终止与管理
在POSIX线程(pthread)库中,线程的终止和管理涉及多个关键函数。以下是关于线程终止的pthread系列函数的详细介绍: 1. pthread_exit:线程主动退出 ✨ 功能: 允许线程主动终止自身,并返回一个退出…...
Elasticsearch 系列专题 - 第三篇:搜索与查询
搜索是 Elasticsearch 的核心功能之一。本篇将介绍如何构建高效的查询、优化搜索结果,以及调整相关性评分,帮助你充分发挥 Elasticsearch 的搜索能力。 1. 基础查询 1.1 Match Query 与 Term Query 的区别 Match Query:用于全文搜索,会对查询词进行分词。 GET /my_index/_…...
【AI提示词】Emoji风格排版艺术与设计哲学
提示说明 Emoji风格排版艺术与设计哲学。 提示词 请使用 Emoji 风格编辑以下段落,该风格以引人入胜的标题、每个段落中包含表情符号和在末尾添加相关标签为特点。请确保保持原文的意思。使用案例(春日穿搭) 🌸 2025春季穿搭灵…...
C语言 ——— 认识C语言
认识 main 函数 main 函数是程序的入口,程序执行时会从 main 函数的第一行开始执行,且一个工程中 main 函数有且只有一个 标准的 main 函数格式: int main() {return 0; } int 是类型,这里指的是 main 函数的返回类型 return…...
44、Spring Boot 详细讲义(一)
Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…...
STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性
目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块,其驱动方式在用采IIC通讯时,常用软件IIC…...
Android 中绕过hwbinder 实现跨模块对audio 的HAL调用
需求 Audio 模块中专门为 TV 产品添加了一些代码,需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。 解决方法 首先将 hdmi HAL 要调用的 audio 接口函数所在的 .so 链接到最基本的 lib.primay.amlogic.so 中(其它平台上这个 .so 文件的名字也可能是…...
基于单片机技术的手持式酒精检测电路设计
基于STC89C52单片机的酒精检测仪设计 目录 基于STC89C52单片机的酒精检测仪设计一、简介二、酒精测试仪总体方案设计2.1 酒精检测仪设计要求分析2.2 设计框图 三、硬件设计3.1 酒精检测电路3.2 模数转换电路3.3 STC89c52单片机电路3.4 LED显示电路3.5 声光报警电路3.6 按键和复…...
【车道线检测(0)】卷首语
车道线检测领域,早期的LaneNet、CondLaneNet等模型。现在在精度、实时性、复杂场景适应性等方面有了更多进展。 Head(输出头)的设计角度分类 在车道线检测任务中,Head(输出头)的设计角度直接影响模型的…...
记一次某网络安全比赛三阶段webserver应急响应解题过程
0X01 任务说明 0X02 靶机介绍 Webserver(Web服务器)是一种软件或硬件设备,用于接收、处理并响应来自客户端(如浏览器)的HTTP请求,提供网页、图片、视频等静态或动态内容,是互联网基础设施的核心…...
AI 越狱技术剖析:原理、影响与防范
一、AI 越狱技术概述 AI 越狱是指通过特定技术手段,绕过人工智能模型(尤其是大型语言模型)的安全防护机制,使其生成通常被禁止的内容。这种行为类似于传统计算机系统中的“越狱”,旨在突破模型的限制,以实…...
项目进度延误的十大原因及应对方案
项目进度延误主要源于以下十大原因:目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中,需求频繁变更是导致延误的关键因素之一&…...
瑞友客户端登录GS_ERP时,报错: 由于安全许可证服务器不能提供许可证,连接被中断的解决方法
瑞友客户端登录GS_ERP时,报错:由于安全许可证服务器不能提供许可证,连接被中断的解决方法 瑞友客户端登录GS_ERP时, 报错:由于安全许可证服务器不能提供许可证,连接被中断的解决方法是由于远程桌面连接协议…...
android wifi通过命令行打开2.4G热点
android系统支持2G和5G,但车机系统应用只支持5G,但是需要测试2.4G的射频 方法如下: 1、adb shell 进去,su 指定root权限,确保热点处于关闭状态 2、开启热点为www99999, 密码为12345678, wpa2的加密协议 cm…...
truncate,drop,delete分析
truncate,drop,delete对比分析 特性 TRUNCATE DROP DELETE **操作对象** 表中的所有数据 整个表及其所有数据 表中的特定数据 **是否保留表结构** 是 否 是 **是否可恢复** 不可恢复 不可恢复 可恢复 **性能** 高 高 低(逐行删除) …...
vue+flask图书知识图谱推荐系统
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F025 架构: vueflaskneo4jmysql 亮点:协同过滤推荐算法知识图谱可视化 支持爬取图书数据,数据超过万条&am…...
什么是微前端?有什么好处?有哪一些方案?
微前端(Micro Frontends) 微前端是一种架构理念,借鉴了微服务的思想,将一个大型的前端应用拆分为多个独立、自治的子应用,每个子应用可以由不同团队、使用不同技术栈独立开发和部署,最终聚合为一个整体产品…...
prompts提示词经典模板
prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板:REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…...
pytorch软件封装
封装代码,通过传入文件名,即可输出类别信息 上一章节,我们做了关于动物图像的分类,接下来我们把程序封装,然后进行预测。 单张图片的predict文件 predict.py 按着路径,导入单张图片做预测from torchvis…...
DAY02:【pytorch】计算图与动态图机制
一、引言 在深度学习框架中,计算图是理解自动求导和模型优化的核心概念。无论是PyTorch的动态图机制,还是TensorFlow早期的静态图模式,计算图都扮演着关键角色。本文将深入解析计算图的基本原理,并结合PyTorch代码演示动态图的运…...
基于元学习(Meta-Learning)的恶意流量检测
元学习(Meta-Learning),即“学会学习”(Learning to Learn),通过让模型从多个相关任务中提取通用知识,实现对新任务的快速适应。在恶意流量检测领域,元学习的核心价值在于从少量攻击样本中泛化出检测规则,尤其适用于新型攻击、定向APT攻击等数据稀缺场景。 一、元学习…...
JavaScript:游戏开发的利器
在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...
玩转Docker | 使用Docker搭建pinry图片展示系统
玩转Docker | 使用Docker搭建pinry图片展示系统 前言一、Pinry介绍Pinry 简介Pinry 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署pinry服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问pinry应用五、pinry基本使用5.1 注册pinry账号…...
DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额——前端篇
专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读385次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…...
企业信息化-系统架构师(九十八)
1在对一个软件系统进行设计与确认后,需要进行架构复审,架构复审目的标识潜在风险,及早发现架构的缺陷和漏洞,在架构复审过程中,主要由()决定架构满足需求,质量需求是否在设计中体现。…...
【C++算法】54.链表_合并 K 个升序链表
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 23. 合并 K 个升序链表 题目描述: 解法 解法一:暴力解法 每个链表的平均长度为n,有k个链表,时间复杂度O(nk^2) 合并两个有序…...
阿里云CDN应对DDoS攻击策略
阿里云CDN遭遇DDoS攻击时,可通过以下综合措施进行应对,保障服务的稳定性和可用性: 1. 启用阿里云DDoS防护服务 阿里云提供专业的DDoS防护服务,通过流量清洗中心过滤恶意流量,确保合法请求正常传输。该服务支持按需选…...
MySQL8的索引跳跃扫描原理
#MySQL 8 的索引跳跃扫描(Index Skip Scan)原理 1. 什么是索引跳跃扫描?索引跳跃扫描(Index Skip Scan)是 MySQL 8.0.13 引入的一种优化技术,允许在某些情况下跳过联合索引的最左前缀字段,仍然…...
centos 启动nginx 服务器
✅ 如果你是通过 yum 安装的 Nginx(推荐方式): 🔹 启动 Nginx: sudo systemctl start nginx 🔹 设置开机自启(建议开启): sudo systemctl enable nginx ὓ…...
格式化输出
% 符号相关 数据类型代码 %s:字符串 示例:print("名字是 %s" % "Tom") → 名字是 Tom%c:字符/ASCII码 示例:print("%c" % 65) → A%d/%i:有符号整数 示例:print("年龄…...
[leetcode]动态规划:斐波那契数列
一.线性dp 1.0什么是线性dp 线性DP就是指状态的转移具有线性递推关系,每个状态只依赖之前的状态,按照线性顺序一步步递推下去。 1.1斐波那契数列问题 #include <iostream> #include <vector> using namespace std; int main() { in…...
HackMyVM - todd记录
HackMyVM - toddhttps://mp.weixin.qq.com/s/E_-hepdfY-0veilL1fl2QA...
【spark认任务提交】配置优先级顺序
配置优先级顺序 Spark-submit 命令行参数 (最高优先级)代码中通过 SparkConf 设置的参数 (在应用程序中直接设置)spark-defaults.conf 文件中的配置 实际应用中的建议 固定配置:将集群级别的默认配置放在 spark-defaults.conf 中应用特定配置:将应用特…...
如何建立高效的会议机制
建立高效的会议机制需做到:明确会议目标、制定并提前分发议程、控制会议时长、确保有效沟通与反馈、及时跟进执行情况。其中,明确会议目标是核心关键,它直接决定了会议的方向与效率。只有明确目标,会议才不会偏离初衷,…...
spark Core-RDD转换算子
1. map算子:对RDD中的数据逐条进行映射转换,可实现类型或值的转换。函数签名为 def map[U: ClassTag](f: T > U): RDD[U] 。 2. mapPartitions算子:以分区为单位处理数据,可进行任意处理。与 map 相比, map 是分区内…...
【图像处理】C++实现通用Raw图转Unpack14的高效方法
一、需求背景 在图像处理领域,我们经常需要处理各种位深的原始数据(如Raw8、Unpack10等)。某些高端相机或传感器会输出14位精度的图像数据,但受传输限制,实际存储时可能采用低位深打包。本文将实现一个通用转换函数&a…...
Vue3的Composition API与React Hooks有什么异同?
Vue3的一个重大更新点就是支持Composition API,而且也被业界称为hooks,那么Vue3的“Hooks”与React的Hooks有这么区别呢? 一、核心相似点 1. 逻辑复用与代码组织 都解决了传统类组件或选项式 API 中逻辑分散的问题,允许将相关逻…...
Gerrit的安装与使用说明(Ubuntu)
#本页面按192.168.60.148服务器举例进行安装配置 1.权限配置 ## 使用root或者有sudo权限用户执行 # 创建gerrit用户 sudo useradd gerrit # 设置gerrit用户的密码 sudo passwd gerrit # 增加sudo权限 sudo visudo 在root ALL(ALL:ALL) ALL行下添加如下内容 gerrit ALL(ALL:…...
如何在Git历史中抹掉中文信息并翻译成英文
如何在Git历史中抹掉中文信息并翻译成英文 在软件开发和版本控制领域,维护一个清晰、一致的代码历史记录是至关重要的。然而,有时我们可能会遇到需要修改历史提交的情况,比如删除敏感信息或修正错误。本文将详细探讨如何在Git历史中抹掉中文…...
Ubuntu利用docker将ONNX模型转换为RK3588模型
1.安装docker 下载教程 1.拉取镜像 方法一:通过命令拉取 # 下载官方Docker镜像sudo docker pull registry.cn-hangzhou.aliyuncs.com/rockchip/rknn-toolkit2:v2.3.0 方法二:通过rknn-toolkit2自带的直接安装 2.开始工作 创建工作目录并复制ONNX模型…...
Go:入门
文章目录 Hello, World命令行参数找出重复行GIF动画获取一个URL并发获取多个URL一个 Web 服务器其他 Hello, World Hello world package main import "fmt" func main() {fmt.Println("Hello, 世界") }package main表明这是一个可独立执行的程序包&#…...
深入理解 ResponseBodyAdvice 及其应用
ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口,允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…...
SpringBoot对接火山引擎大模型api实现图片识别与分析
文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上,在上一篇博客,我们已经实现了spring ai对接本地大模型实现了聊天机器人,但是目前有个新…...
Java ---成员,局部变量与就近原则
成员变量 声明在类内部,但在方法、构造器或代码块之外的变量。 属于类的实例(对象)或类本身(静态变量)。 实例变量(非静态成员变量): public class Person {private String name…...
基于libevent写一个服务器(附带源码)
使用libevent搭建服务器 服务器源码二级目录 使用开源框架,目的是减少程序员对一些精细的操作的误操作,也是为了让程序员能更好的对接业务而不是底层api的使用。 为何使用libevent,因为libevent开源已经有十几年了,能很好的承受数…...
2.2.3 Spark Standalone集群
搭建Spark Standalone集群需要完成多个步骤。首先,配置主机名、IP地址映射、关闭防火墙和SeLinux,并设置免密登录。接着,配置JDK和Hadoop环境,并在所有节点上分发配置。然后,下载并安装Spark,配置环境变量和…...