网络通讯安全基础知识(加密+解密+验签+证书)
1、加密解密基本概念
通讯的加密和解密主要涉及将原始信息(明文)转换为不可直接理解的格式(密文),以及将密文还原为原始信息的过程。这一过程通常包括三个基本步骤:加密、传输和解密,其中加密和解密分别使用特定的算法和密钥进行。
2、加密
加密是将原始信息(明文)通过特定的算法和密钥转换为密文的过程。这个过程旨在保护信息在传输过程中不被未经授权的第三方获取或理解。加密方法包括但不限于替换密码(如凯撒密码)、转换密码(如无线电扩频通信)以及使用专门的加密机进行加密。随着技术的发展,现代加密技术还包括对称加密(如DES、AES 、RC4算法)和非对称加密(如RSA算法),后者通常用于数字签名和公钥基础设施中。
2.1对称加密
加密和解密过程使用同一个密钥。这意味着发送方使用密钥对要传输的数据进行加密,接收方则使用相同的密钥对加密后的数据进行解密,以恢复原始数据。
由于加密和解密使用的是同一个密钥,且算法通常较为简单,因此加密和解密的速度较快,适合对大量数据进行加密和解密。
public class AesExample {public static void main(String[] args) throws Exception {// 生成密钥KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(128); // 可选:128, 192, 256SecretKey secretKey = keyGen.generateKey();byte[] key = secretKey.getEncoded();// 加密String plaintext = "Hello, World!";Cipher encryptCipher = Cipher.getInstance("AES");encryptCipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] encryptedBytes = encryptCipher.doFinal(plaintext.getBytes());String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted Text: " + encryptedText);// 解密Cipher decryptCipher = Cipher.getInstance("AES");decryptCipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedText));String decryptedText = new String(decryptedBytes);System.out.println("Decrypted Text: " + decryptedText);}
}
2.2非对称加密
采用两个密钥,即公钥和私钥。公钥用于加密数据,私钥则用于解密数据。公钥可以公开分享,而私钥则必须保密。
加密和解密使用的是不同的密钥,且算法相对复杂,因此加密和解密的速度较慢,只适合对少量数据进行加密和解密。
3、解密
解密是接收方使用相应的解密算法和密钥将收到的密文还原为原始明文的过程。解密是加密的反向操作,需要使用与加密过程中相同的算法和密钥。解密的成功与否取决于密钥的保密程度以及加密算法的安全性。如果密钥被泄露或算法被破解,那么加密的信息就不再安全。
3.1对称加密的解密
对称加密,也称为单密钥加密,在加密过程中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密文发送出去,接收方在收到密文后,需要使用与加密时相同的密钥以及相应算法的逆算法对密文进行解密,才能恢复成原始的明文数据。
3.2非对称加密的解密
非对称加密使用一对密钥:公钥和私钥。公钥可以公开分享,而私钥则必须保密。在加密过程中,发送方使用接收方的公钥对要传输的数据进行加密,然后将加密后的密文发送给接收方,接收方在收到密文后,使用自己的私钥对密文进行解密,以恢复成原始的明文数据。由于私钥是保密的,且公钥无法推导出私钥,因此即使公钥被泄露,加密的数据仍然安全。
public class RsaExample {public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(2048);KeyPair keyPair = keyGen.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 加密String plaintext = "Hello, World!";Cipher encryptCipher = Cipher.getInstance("RSA");encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedBytes = encryptCipher.doFinal(plaintext.getBytes());String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted Text: " + encryptedText);// 解密Cipher decryptCipher = Cipher.getInstance("RSA");decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedText));String decryptedText = new String(decryptedBytes);System.out.println("Decrypted Text: " + decryptedText);}
}
4、加签
加签是指在数据传输前,使用密钥对数据进行加密生成数字签名的过程。这个过程包括使用私钥对数据进行加密,生成数字签名,并将数字签名与原始数据一起发送给接收方。数字签名的生成过程需要使用私钥,而验证过程则使用相应的公钥。加签的目的是为了证明消息的完整性和真实性,只有拥有密钥的人才能生成数字签名,且数字签名是与消息相关联的,一旦消息被更改,数字签名也会失效
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;public class KeyPairGeneratorExample {public static void main(String[] args) {try {// 使用RSA算法生成密钥对KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);// 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();System.out.println("公钥:" + keyPair.getPublic());System.out.println("私钥:" + keyPair.getPrivate());} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}
}
在上述代码中,我们使用了RSA算法生成一个2048位的密钥对,其中KeyPairGenerator.getInstance("RSA")用于获取RSA算法的密钥对生成器,initialize(2048)用于设置密钥长度,generateKeyPair()用于生成密钥对。
接下来,我们使用私钥对数据进行加签
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Signature;public class SignExample {public static void main(String[] args) {try {// 使用RSA算法生成密钥对KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair = keyPairGenerator.generateKeyPair();// 使用私钥对数据进行加签String data = "Hello World!";byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(keyPair.getPrivate());signature.update(dataBytes);byte[] signBytes = signature.sign();System.out.println("数字签名:" + new String(signBytes, StandardCharsets.UTF_8));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}
在上述代码中,我们使用了SHA256withRSA算法生成数字签名,其中Signature.getInstance("SHA256withRSA")用于获取SHA256withRSA算法的签名对象,initSign(keyPair.getPrivate())用于初始化签名对象并指定私钥,update(dataBytes)用于更新待加签的数据,sign()用于生成数字签名
5、验签
验签是指在数据接收端,使用相同的密钥和加密算法对数据进行解密并验证数字签名的过程。接收方收到原始报文和数字签名后,使用公钥对数字签名进行解密,如果能得到摘要信息,说明的确是持有与该公钥匹配的私钥的发送方发出的。然后,对收到的数据使用相同的哈希函数生成摘要,将得到的摘要结果与解密出来的摘要进行对比。如果两者一致,就证明数据未被修改过。这个过程称为验证数字签名,简称验签
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.PublicKey;
import java.security.Signature;
public class VerifyExample {public static void main(String[] args) {try {// 假设这里已经有了签名数据和原始数据String data = "Hello World!";byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);byte[] signBytes = /* 这里填入加签代码生成的签名数据 */;// 获取公钥PublicKey publicKey = /* 这里填入对应的公钥 */;// 使用公钥对签名进行验签Signature signature = Signature.getInstance("SHA256withRSA");signature.initVerify(publicKey);signature.update(dataBytes);boolean verified = signature.verify(signBytes);if (verified) {System.out.println("数字签名验证通过");} else {System.out.println("数字签名验证不通过");}} catch (Exception e) {e.printStackTrace();}}
}
在验签代码中,需要填入加签代码生成的签名数据、对应的公钥,然后使用公钥对签名进行验证。如果验证通过,则说明数字签名有效;否则,说明数字签名无效。
为什么有了加密解密还需要加签验签?
假设A想向B发送一份重要的文件,并且希望确保文件在传输过程中没有被篡改。A可以对文件进行数字签名(加签),然后将文件和数字签名一起发送给B。B在接收到文件后,可以使用A的公钥对数字签名进行验证,以确认文件的完整性和真实性。
如果在传输过程中有攻击者E尝试篡改文件内容,即使E能够拦截并修改了文件,但由于E没有A的私钥无法伪造有效的数字签名。因此,B在验证数字签名时会发现签名无效,从而知道文件已被篡改。
通过加签验证,B可以确保接收到的文件是由A签署的原始文件,而不是经过篡改的文件。这样可以防止数据被篡改、伪造或否认,保证数据的安全性和可靠性。
因此,加签验证在数据传输和通信过程中起着非常重要的作用,是保障数据完整性和真实性的重要手段。
6、证书
在网络通信中,证书(Certificate)是用于验证通信双方身份的一种电子文档,通常由权威的第三方机构(称为证书颁发机构,CA)颁发。证书在保障网络通信的安全性和可信性方面起着至关重要的作用。
例如,当你访问一个HTTPS网站时,服务器会提供一个证书给浏览器,浏览器会验证该证书,确认服务器的身份是真实的,而不是假冒的
6.1证书的作用
验证公钥的真实性和可信性。
确认公钥持有者的身份
通过权威的第三方(证书颁发机构,CA)建立信任链。
6.2证书的组成
- 版本号:标识证书的版本。
- 序列号:唯一标识一个证书的编号。
- 签名算法:用于生成证书签名的算法。
- 发行者(Issuer):颁发证书的 CA 的名称。
- 有效期:证书的有效时间段。
- 主体(Subject):证书持有者的名称。
- 主体公钥信息:证书持有者的公钥及其算法信息。
- 扩展(Extensions):可选的扩展信息。
- 签名:由 CA 使用其私钥对证书内容进行签名。
6.3证书的工作原理
证书的工作原理基于公钥加密和数字签名技术,主要包括以下步骤
1. 证书申请:申请者生成一对公私钥,并将公钥和相关信息提交给 CA 进行证书申请。
2. 证书颁发:CA 对申请者的身份进行验证,验证通过后使用 CA 的私钥对申请者的公钥和相关信息进行签名,生成证书
3. 证书分发:申请者获得证书后,可以将证书分发给通信对象。
4. 证书验证:通信对象使用 CA 的公钥对证书进行验证,确保证书的真实性和完整性。
5. 安全通信:通信双方通过证书进行身份验证和数据加密,实现安全通信。
相关文章:
网络通讯安全基础知识(加密+解密+验签+证书)
1、加密解密基本概念 通讯的加密和解密主要涉及将原始信息(明文)转换为不可直接理解的格式(密文),以及将密文还原为原始信息的过程。这一过程通常包括三个基本步骤:加密、传输和解密,其中加密…...

[数据集][目标检测]石油泄漏检测数据集VOC+YOLO格式6633张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6633 标注数量(xml文件个数):6633 标注数量(txt文件个数):6633 标注…...

【Oracle篇】全面理解优化器和SQL语句的解析步骤(含执行计划的详细分析和四种查看方式)(第二篇,总共七篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

都2024年了还不明白Redis持久化?RDB文件、AOF文件、AOF重写
都2024年了,不会还有人不知道redis的RDB和Aof吧?不知道没关系,看完这篇文章我相信你就会有个大概的了解和认识了 1. Redis持久化 1.1 持久化概念 Redis本身是一个基于内存的数据库,它提供了RDB持久化、AOF持久化两种方式&#…...
浅谈Unity协程的工作机制
一. 什么是协程 协程概述 在 Unity 中,协程(Coroutine)是一种非常常用的机制,用于非阻塞地处理需要跨越多个帧、等待某些条件或延迟一段时间才能完成的任务。Unity 的协程通过 C# 的 IEnumerator 和 yield return 实现࿰…...

数学建模_数据预处理流程(全)
数据预处理整体流程图 一般数据预处理流程 处理缺失值:填补或删除缺失值。处理异常值:检测并处理异常值。数据编码:将分类变量进行标签编码或独热编码。数据标准化/归一化:对数据进行标准化或归一化处理。连续变量离散化ÿ…...
深入解析Flink SQL:基本概念与高级应用
深入解析Flink SQL:基本概念与高级应用 目录 深入解析Flink SQL:基本概念与高级应用 引言 一、Flink SQL概述 1. Flink SQL的定义 2. Flink SQL与传统SQL的区别 二、Flink SQL的核心特性 1. 事件时间和处理时间 2. 窗口操作 3. 连接和聚合操作 …...

计算机的发展史和基本结构
好久不见,粉粉们,我是#Y清墨。今天来分享一下最近学习做的笔记。 计算机发展史和四代计算机概述 阶段 年代 电子元件 运算速度(每秒/次) 第一代 1946-1958 真空电子管 数千至数万 第二代 1958-1964 晶体管 几十万至百万…...
VSTO常见的异常
在开发和使用 VSTO(Visual Studio Tools for Office)插件时,常见的异常主要涉及到与 Microsoft Office 应用程序(如 Excel、Word、Outlook 等)的交互、环境配置和 COM 组件的使用。以下是一些常见的异常及其可能的原因…...

【H2O2|全栈】关于HTML(3)HTML基础(二)
HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类(二) 本文中的标签在什么位置使用? 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…...
前端AST
前端AST 1、什么是编译器2、什么是AST3、编译器的基本思路3.1 词法分析3.2 语法分析3.3 代码转换3.4 代码生成3.5 完整链路 4、一个简单的编译器的实现4.1 词法分析4.2 语法分析4.3 代码转换4.4 代码生成4.5 完整流程 1、什么是编译器 定义:编译器就是个将当前语言…...

基于EPS32C3电脑远程开机模块设计
基于EPS32C3电脑远程开机模块设计 前言 缘起,手头资料太多了,所以想组一台NAS放在家里存储数据。在咸鱼淘了一套J3160主板加机箱,加上几块硬盘组建NAS。 对于NAS,我的需求是不用的时候关机(节省功耗),要用的时候开机…...
深度解析 Netty 性能卓越的背后原因
一、引言 在当今数字化时代,构建高性能、高可靠的网络应用成为了技术领域的关键需求。Netty 作为一款备受推崇的网络应用框架,以其出色的性能在众多框架中脱颖而出。深入探究 Netty 性能卓越的原因,不仅能够帮助开发者更好地理解和运用这一框…...

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!
虚幻引擎(Unreal Engine)火了黑神话游戏。 往后,会有大批量的公司开始模仿这个赛道! C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎,如虚幻引擎(Unreal Engine)等。以下是对 C 虚拟引…...
华为-2022-测试面试题
文章目录 一、源数组a,将a中所有元素乘以2之后组成一个新数组,则这个新数组就叫双倍数组,给你一个数组a,判断它是不是双倍数组,如果是则输出源数组,不是则输出空数组。二、如果想把一个文件移动到另一个文件…...

Linux-(系统启动、用户管理)
目录 前言 关机&重启命令 基本介绍 注意细节 用户登录和注销 注意: 用户管理 基本介绍 添加用户 指定/修改密码 删除用户 查询用户信息 切换用户 查看当前用户登录用户 用户组 新增组 删除组 查看所有组 修改用户所属组 创建用户时指定用户…...

机器学习:opencv--图像形态学
目录 前言 一、常用形态学操作 二、腐蚀和膨胀 1.图像腐蚀 2.图形膨胀 三、开运算和闭运算 1.开运算 2.闭运算 四、顶帽和黑帽 1.顶帽 2.黑帽 五、梯度运算 总结 前言 图像形态学是一种用于处理和分析图像形状和结构的技术。 一、常用形态学操作 膨胀(…...

网络基础入门指南(一)
前言 在这个高度互联的世界里,互联网已成为日常生活不可或缺的一部分。然而,对于许多人来说,网络是如何工作的仍然是个谜。本文旨在为那些对网络基础知识感兴趣的朋友提供一个简单的介绍,帮助大家更好地理解互联网的基本原理和技…...

【项目】云备份
云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…...

WebGL系列教程二(环境搭建及初始化Shader)
目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...