加解密和签名验签简述

2023-11-18


一. 数字加密算法

  • 数字加密算法中,通常可划分为对称加密非对称加密

1. 对称加密

  1. 概念:加密和解密使用同一个密钥,所以叫做对称加密。
  2. 常见的对称加密算法:DES,AES。
    在这里插入图片描述

2. 非对称加密

  1. 概念:加密和解密使用两个的密钥,一把作为公开的公钥(Public Key),另一把作为私钥(Private Key)。因为加密和解密使用的不是同一把密钥,所以这种算法称为非对称加密算法。
    • 公钥和私钥成对存在,通常【公钥加密,私钥解密】;
    • 公钥是基于私钥而存在的。通过私钥经过一系列算法是可以推导出公钥,但无法通过公钥反向推倒出私钥。
  2. 常见的非对称加密算法:RSA,ECC。

在这里插入图片描述

3. 对称加密和非对称加密的区别

  1. 对称加密:加解密效率高。但在非安全信道中通讯时,密钥交换的安全性不能保障。
  2. 非对称加密:加解密效率低,但可以保证密钥安全性。
  3. 通常在实际的网络环境中,会将两者混合使用。两者混合使用的示例如下:

在这里插入图片描述


二. 使用keytool生成证书

1. 创建证书

  1. 新建文件夹:/xxx/keytool_study
  2. 创建证书,并存放到密钥库中:使用keytool命令

zijikanwa-mac:keytool_study zijikanwa$ keytool -genkeypair -alias “test1” -keyalg “RSA” -keystore “test.keystore”

  • 说明
    • 两次输入密码时,第一次输入的是密钥库(keystore)的密码,第二次输入的是证书条目的密码
    • 命令含义:创建一个别名为test1的证书条目,该条目存放在名为test.keystore的密钥库中,若test.keystore密钥库不存在则创建。
    • 命令的参数说明:
      • -genkeypair:生成一对非对称密钥;
      • -alias:指定密钥对的别名,该别名是公开的;
      • -keyalg:指定加密算法,本例中的采用通用的RAS加密算法;
      • -keystore:密钥库的路径及名称。如果不指定,默认在操作系统的用户目录下生成一个".keystore"的文件
  • 执行结果
zijikanwa-mac:keytool_study zijikanwa$ keytool -genkeypair -alias "test1" -keyalg "RSA" -keystore "test.keystore"
输入密钥库口令:  
再次输入新口令: 
您的名字与姓氏是什么?
  [Unknown]:  zijikanwa
您的组织单位名称是什么?
  [Unknown]:  alihealth.com    
您的组织名称是什么?
  [Unknown]:  alihealth
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  beijing
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn是否正确?
  [否]:  y

输入 <test1> 的密钥口令
	(如果和密钥库口令相同, 按回车):  
再次输入新口令: 

2. 查看密钥库

  • 命令说明:查看名为test.keystore的密钥库中的证书条目

zijikanwa-mac:keytool_study zijikanwa$ keytool -list -keystore test.keystore

2.1 keytool -list 命令
zijikanwa-mac:keytool_study zijikanwa$ keytool -list -keystore test.keystore
输入密钥库口令:  
密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

test1, 2020-5-18, PrivateKeyEntry, 
证书指纹 (SHA1): 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
2.2 keytool -list -v 命令

zijikanwa-mac:keytool_study zijikanwa$ keytool -list -v -keystore test.keystore

zijikanwa-mac:keytool_study zijikanwa$ keytool -list -v -keystore test.keystore
输入密钥库口令:  
密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 1 个条目

别名: test1
创建日期: 2020-5-18
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
发布者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
序列号: 5a0e9666
有效期为 Mon May 18 14:53:09 CST 2020 至 Sun Aug 16 14:53:09 CST 2020
证书指纹:
	 MD5:  6B:2D:30:CA:D0:C9:22:6C:2E:88:6A:4D:02:E2:58:FB
	 SHA1: 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
	 SHA256: B9:20:43:76:D3:2A:17:BC:82:79:C5:CF:9F:56:49:E5:68:3E:75:9A:CF:0A:D5:A8:8C:AC:FD:54:3C:E0:AD:A5
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

3. 将密钥库中的证书条目导出到证书文件

zijikanwa-mac:keytool_study zijikanwa$ keytool -export -alias test1 -file test.crt -keystore test.keystore
命令含义:将名为test.keystore的证书库中别名为test1的证书条目导出到证书文件test.crt中

zijikanwa-mac:keytool_study zijikanwa$ keytool -export -alias test1 -file test.crt -keystore test.keystore
输入密钥库口令:  
存储在文件 <test.crt> 中的证书

4. 查看证书文件test.crt的信息

zijikanwa-mac:keytool_study zijikanwa$ keytool -printcert -file “test.crt”
命令含义:查看证书文件test.crt的信息

zijikanwa-mac:keytool_study zijikanwa$ keytool -printcert -file "test.crt"
所有者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
发布者: CN=zijikanwa, OU=alihealth.com, O=alihealth, L=beijing, ST=beijing, C=cn
序列号: 5a0e9666
有效期为 Mon May 18 14:53:09 CST 2020 至 Sun Aug 16 14:53:09 CST 2020
证书指纹:
	 MD5:  6B:2D:30:CA:D0:C9:22:6C:2E:88:6A:4D:02:E2:58:FB
	 SHA1: 6D:B8:E6:E5:E5:2D:D0:5B:AF:5B:16:4D:5E:05:6B:C7:21:DD:D1:6A
	 SHA256: B9:20:43:76:D3:2A:17:BC:82:79:C5:CF:9F:56:49:E5:68:3E:75:9A:CF:0A:D5:A8:8C:AC:FD:54:3C:E0:AD:A5
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

三. 加解密和签名验签的实现逻辑

  • 概述流程图
    在这里插入图片描述

1. CA机构和被发证书者的沟通

  1. CA公钥:验证证书时使用
  2. CA根证书(或中级证书)为ca.cer
    在这里插入图片描述
  3. 验证证书是否合法的步骤
    1. 证书是否是合法CA机构颁发。
    2. 证书有效期(一般是一年)。
    3. 证书是否在黑名单吊销列表里。
  • 服务端B生成密钥对,并CA注册公钥,生成server.cer证书;
  • 服务端B发送server.cer证书到安卓端A,A会验证B证书的有效性,才会取出B的公钥,做后续其他处理。
    在这里插入图片描述

2. 加密

  • 加密:防止数据泄露。
  • 加密解密流程:公钥加密,私钥解密
    在这里插入图片描述

3. 签名验签

  1. 签名验签的作用:比如A给B发送数据(B<–A),则签名验签是用来让B验证给他发消息的是A。
  2. 签名的常见方案
  1. 对加密后的密文(用私钥)进行签名。
  2. 对密文选取部分内容进行签名。
  3. 对keys(即对key做非对称加密后的结果)和部分密文进行签名。
  1. 签名验签流程:私钥签名,公钥验签。
    在这里插入图片描述

  2. 常见场景:网银验证用户身份(银行B<–用户A)

  3. 单向认证 & 双向认证

  1. 单向认证:服务端有证书,客户端没有证书。
    1. 保证我的客户端只能访问自己信任的服务器;
    2. 不能保证我们的服务器只能被我们自己的客户端访问。
      在这里插入图片描述
  2. 双向认证:银行(银行需要验证用户身份,用户也需要验证银行身份)。
    在这里插入图片描述

四. HTTPS的流程

HTTPS采用非对称加密+对称加密算法
在这里插入图片描述

  1. 客户端(如浏览器)请求一个url,比如https://baidu.com。
  2. server端收到请求后,把自己的公钥通过数字证书的方式传给客户端。
    • 公钥不能直接传:直接传不安全
  3. 客户端收到证书后,首先验证证书的合法性(使用CA公钥验证)。
  4. 如果证书合法,client会产生一个密钥key,利用刚刚拿到的server公钥对该密钥key进行加密,然后将加密后的密钥keys传给server。
  5. server端拿到该密钥keys之后,使用自己的私钥进行解密,即可得到client的密钥key。
  6. server端将client要的内容使用key进行加密,然后传给client。
  7. client拿到内容后使用key进行解密,同时展示内容。

小知识:公钥不能直接传的原因
在这里插入图片描述

参考资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加解密和签名验签简述 的相关文章

  • Jenkins持续集成项目实践 —— 基于Python Selenium自动化测试(二)

    上一篇讲了如何搭建jenkins 这篇主要讲 怎么将自动化代码与jenkins衔接起来 jenkins上运行的两种方式 第一种 在jenkins上面运行本地代码 操作如下 新建项目 项目名称根据自己项目情况填写并选择自由模式 进行配置根据如
  • LaTeX中插入matlab代码(可添加中文注释)的几种方法

    最近在用LaTeX写文件时 需要插入matlab代码 但是matlab代码编写时没有注意到注释为中文所带来的不便 导致在编写LaTeX文件时总是报错 经查阅网上有关这方面的资料和自己不断地尝试之后 总结其中的方法如下 使用matlab的mc
  • 【满分】【华为OD机试真题2023 JS】字母组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字母组合 知识点回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 每个数字对应多个字母 对应关系如下 0 a b c 1 d e f 2 g h i 3 j
  • Android MVP 详解(上)

    作者 李旺成 时间 2016年4月3日 Android MVP 详解 下 已经发布 欢迎大家提建议 MVP 在 Android 上的使用其实已经有挺长一段时间了 长到似乎有点 过时 了 目前风头正劲的是MVVM 那为什么现在还要讲 MVP
  • tf.nn.atrous_conv2d如何实现空洞卷积?

    转载自 https blog csdn net mao xiao feng article details 78003730 介绍 关于空洞卷积的理论可以查看以下链接 这里我们不详细讲理论 1 Long J Shelhamer E Darr
  • 业务实战中如何利用MySQL函数来解决

    随着我们业务越来越复杂的情况下 完全基于java后台来解决首先是很麻烦 而且性能带来降低 代码的可读性下降 这个时候就需要一些MySQL的函数来解决了 这篇文章对于常见的MySQL函数不予介绍 concat函数 使用方法 CONCAT st
  • Flink设置Source数据源使用kafka获取数据

    流处理说明 有边界的流bounded stream 批数据 无边界的流unbounded stream 真正的流数据 Source 基于集合 package com pzb source import org apache flink ap

随机推荐

  • I Hate It

    很多学校流行一种比较的习惯 老师们很喜欢询问 从某某到某某当中 分数最高的是多少 这让很多学生很反感 不管你喜不喜欢 现在需要你做的是 就是按照老师的要求 写一个程序 模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 Input 本题
  • volatile和synchronized的区别

    共性 volatile与synchronized都用于保证多线程中数据的安全 区别 1 volatile修饰的变量 jvm每次都从主存 主内存 中读取 而不会从寄存器 工作内存 中读取 而synchronized则是锁住当前变量 同一时刻只
  • 第一次 openwrt源码下载编译

    openwrt 学习记录 第一次 openwrt源码下载编译 MT7620开发板 安装虚拟机VMware 安装Ubnutu 先进入root账户 topeet ubuntu su 输入密码 1 搭建编译环境 参考 https blog csd
  • maven的使用

    目录 一 maven基本参数 二 maven基础结构 三 mvn的打包和运行 一 maven基本参数 groupId 是指项目里面的标识 一般写法是com mycom myapp 其中mycom是指你公司的域名 例如com google m
  • YOLOv5+PaddleOCR手写签名识别

    YOLOv5 PaddleOCR手写签名识别 介绍 参加了一个中国移动的比赛 比赛的数据集是一个工单 上面有多个人的签名还有手写的时间 因为主办方不允许数据公开 所以在这一系列博客中 我主要讲一下实现的思路 在YOLO演示的时候我会用其他的
  • 查看linux服务器内存信息

    查看服务器内存信息 dmidecode grep P A5 Memory s Device grep Size root localhost home dmidecode grep P A5 Memory s Device grep Siz
  • 【leetcode刷题】--- 21.合并两个有序链表(C++递归)

    21 合并两个有序链表 原题链接 https leetcode cn com problems merge two sorted lists 题目 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成
  • 关于ApplicationContext的getBean()方法发现

    假定 Son类实现father接口 在Son类定义声明式事务后 通过ApplicationContext接口的getBean Class arg0 方法获取注入好的bean会报异常 方法参数Son class Son已声明bean org
  • 18. 线性代数 - 线性变换

    文章目录 线性空间 线性变换 线性变换的几何意义 特征值与特征向量 NumPy的矩阵操作 Hi 你好 我是茶桁 经历了几节线性代数课程之后 终于咱们到了最后一节课了 本节课的内容说多不多 说少也不少 我们先是要理解一下线性空间和线性变换 并
  • uml之Robustness Diagram

    Robustness Diagram 从需求分析到架构设计 转载自 http www dotblogs com tw jed archive 2010 11 21 robustness diagram aspx 什么是Robustness
  • Java IO流

    目录 一 认识Java的流 二 使用字节流读写文本文件 三 使用字符流读写文本文件 四 读写二进制文件 五 序列化和反序列化 六 总结 一 认识Java的流 1 读文件是指把文件中的数据读取到内存中 2 写文件是把内存中的数据写到文件中 3
  • 2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

    1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河 研究黄河水沙通量的变化规律对沿黄流域的环境治理 气候变 化和人民生活的影响 以及对优化黄河流域水资源分配 协调人地关系 调水调沙 防洪减灾 等方面都具有重要的理论指导意义 附件
  • spring boot 之 kotlin语言开发,用一次就想放弃Java,爽歪歪~~~

    废话少说 上视频 spring boot 之 kotlin用一次就想放弃java 爽歪歪 1 启动入口 SpringBootApplication EnableDiscoveryClient class TawuziAuthServerDb
  • LVGL V8学习之键盘按键样式重绘(二)

    这一篇继续研究一下基于btnmatrix的键盘按键重绘 是对上一篇LVGL V8学习之键盘按键样式重绘 一 的代码的优化 还是通过codeblock来模拟代码的运行 代码如下 按键矩阵的事件回调函数 static void btnmatri
  • vue后台管理系统—— 模糊查询和列表分页展示

    1 效果显示 通过输入作品名称或者开始时间或者结束时间来显示数据列表 这里的三项选择可以输入其一 也可以都输入 2 分页代码 用的是element组件 包括表格 上面的搜索 div class personalident top div
  • pycharm scrapy 爬取“文章”(文章阅读网)

    import scrapy import re from urllib import parse from scrapy http import Request from Article spider Article spider item
  • nvm使用大全nvm如何动态切换node版本

    注意 nvm use node版本时 要使用管理员权限打开cmd输入命令 否则报错 常用命令 nvm ls 列出所有已安装的 node 版本 nvm list 列出所有已安装的 node 版本 nvm list available 显示所有
  • java基础:日志框架

    文章目录 一 日志技术的概述 二 日志技术体系 三 Logback日志框架 四 Logback快速入门 五 Logback 配置详解 5 1 输出位置 格式设置 5 2 对日志不同内容是否输出的控制 一 日志技术的概述 程序中的日志可以用来
  • Linux 数据库备份与恢复

    1 备份数据主要使用dump命令 格式为 mysqldump u db user p db passwd db name gt backup dir db name time sql p 和 db passwd之间没有空格 不然 db pa
  • 加解密和签名验签简述

    文章目录 一 数字加密算法 1 对称加密 2 非对称加密 3 对称加密和非对称加密的区别 二 使用keytool生成证书 1 创建证书 2 查看密钥库 2 1 keytool list 命令 2 2 keytool list v 命令 3