IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 公钥、私钥、数字签名和数字证书的概念及解密 -> 正文阅读

[网络协议]公钥、私钥、数字签名和数字证书的概念及解密

http协议的数据传递是明文的, 也就是从服务器传递给浏览器的内容是明文的, 这个信息如果被截取了,内容也就完全暴露了。所以大部分的互联网网站和应用使用的基本都是https协议,在申请和配置网站的https协议时,经常会听到的几个概念有:

  • 密钥
  • 公钥
  • 私钥
  • 消息摘要
  • 数字签名
  • 数字证书
    这些概念究竟是什么意思呢?它们之间有什么关系呢?怎么样能最直观的理解它们呢?

概念解析

  • 密钥: 对称加密设置的密码
  • 公钥: 公钥用于加密信息和解密数字签名
  • 私钥: 私钥用于解密信息和加密消息摘要
  • 消息摘要,数字指纹 : 对消息使用HASH算法获取的固定长度的字符串
  • 数字签名: 使用私钥加密的消息摘要
  • 数字证书:CA用自己的私钥,对需要认证的公钥及相关的信息进行加密

对于加密这个词,最直观的想法就是设置一个密码,使用这个密码对一段内容进行加密得到密文, 然后又使用同样的密码解密密文得到原文, 这就是对称加密。这个用来加密和解密的密码就是密钥
在这里插入图片描述

在对称加密中,如果密码泄露了,则双方的通讯也就不安全了。所以就有了非对称加密,非对称加密是一次产生一对密钥, 也称为密钥对,也就是一个公钥和一个私钥,这两个密钥 ,一个用来加密,一个用来解密。 通讯的双方分别把公钥给对方,留存私钥。发送信息给对方是,使用对方的公钥对信息加密,对方使用自己的私钥解密, 如下图所示:
在这里插入图片描述

公钥对外是公开的,即使加密的信息被截获了, 没有私钥也是无法解密内容。 这样看起来传递的信息是安全的。
但是如果黑客获取了内容之后, 对内容进行了篡改了呢? 比如说删除了一部分内容之后再发给某一方。由此,就产生了数字签名。了解数字签名之前, 先看看消息摘要,消息摘要是对一个数据块的数字指纹,这个数字指纹是一串固定长度的字符串,其有一个特性就是不同的消息的消息摘要不一样, 也就是如果消息被更改了, 消息摘要肯定不一样。
在上面的例子中, 甲使用自己的私钥对消息摘要进行加密,连同乙的公钥加密的正文一起发送给乙;乙使用甲的公钥解密消息摘要, 使用自己的私钥解密得到正文,再运算出正文的摘要, 将这两个摘要进行对比,如果这两个摘要相同说明这个正文没有被篡改过。
这个使用私钥加密的消息摘要就是数字签名
在这里插入图片描述

可是如果黑客转换一下思维呢? 不关注获取的信息,而是传递一个假的信息。 因为公钥是公开的,黑客可以获取某一方的公钥,如果黑客替换了接收者的公钥,则其就可以用自己的私钥发送签名的内容给接收者。接收者使用错误的公钥验证黑客发送的内容却是可以通过校验的,这样接收者就接收了错误的内容。 如下图:
在这里插入图片描述

这里的关键问题就是: 如何确保某个公钥是可信的,如果说甲怎么知道乙的公钥的确是乙的呢?而不是某人伪造的呢? 在现实生活中的例子就是如何确保某个人拿的身份证是真的呢? 生活中最简单的就是到派出所查询一下就可以了, 对于公钥的认证也有一个专门认证的CA机构(Certificate Authority)。CA机构本身也有一对公私钥,CA用自己的私钥,对需要认证的公钥及相关的信息进行加密,生成**“数字证书”**,而CA的公钥就是默认放在操作系统或浏览器中。

https 的非对称加密和对称加密

任何事物都是由两面的,非对称加密安全,但是效率不好, 最慢甚至能达到1000倍;对称加密安全性不高,但是速度比较快。
https 不是单纯的非对称加密, 也不是单纯的对称加密,https中结合了两者的优点,即:

  • 使用非对称加密加密密钥
  • 获取密钥之后,使用密钥的对称加密传送正文

如何产生密钥和证书

Java自带了keytool 用来进行密钥和证书的管理。

使用keytool 产生公私钥到一个密钥库文件中。

Java密钥库文件的后缀名一般是 .keystore , 产生一对公私钥使用 genkeypair ,完整的命令示例如下:

keytool -genkeypair -alias mykey -keyalg RSA -keypass mykeypass -keystore my.keystore -storepass mystorepass -dname "CN=myname,OU=mydept,O=mycompany,L=HF,ST=AH,C=CN"
  • -alias mykey -keyalg RSA 别名和算法
  • -keypass 密钥的管理密码, 因为有可能对密钥库这个条目进行修改。
  • -keystore 证书库文件
  • -storepass 证书库文件的密码
  • -dname 个人的相关信息,一般是需要申请的域名的相关信息
    如果觉得以上命名行过长的话,也可以使用交互式命名, 比如:
keytool -genkeypair -alias mykey -keyalg RSA -keypass

或者更简单:

keytool -genkeypair

后面根据提示进行输入。
因为JKS是Java的专用格式, 在执行命令时建议使用标准格式。
在这里插入图片描述

这里出于演示,依据以JKS标准的文件进行演示, 产生后的my.keystore是一个二进制文件, 使用文本编辑器打开后的效果如下:
在这里插入图片描述

从密钥库文件导出证书

数字证书一般由CA机构颁发,也可以产生自签名的证书。

  • CA机构的证书,默认状况浏览器是直接信任的
  • 自签名的证书,浏览器认为是不安全的,但是可以在浏览器进行信任。

以Tomcat服务器为例, 配置上面产生的密钥库文件my.keystore之后,在浏览器端就可以导出证书和信任这个证书, 详细的步骤可以参考以下一篇:
Https及基于Tomcat的开发配置

除了在浏览器导出证书之外, keytool 也提供了直接从密钥库文件导出证书的命令exportcert, 完整的命令类似:

keytool -exportcert -v -alias mykey -keystore my.keystore -file my.cer -storepass mystorepass

使用上面命令导出的证书my.cer,在Windows 下可以直接双击打开。打开后的效果如下:

在这里插入图片描述

看一看,证书包含哪些内容呢?

  • 公钥相关信息
  • 颁发者和使用者的人员信息
  • 有效期
  • 指纹 ,私钥的数字签名
  • 其他信息
    这个证书文件也是二进制的, 使用文本打开的效果和打开密钥库文件类似。
    那么证书文件是否可以以文本方式显示呢? 答案是可以的,使用openssl 即可。

openssl 将二进制的证书文件转换为文本显示

openssl 是SSL相关的命令行工具。Linux 默认包含整个工具。 Windows 下没有,但是可以另外安装。
相关安装和使用可以参考: SSL/TLS 工具 OpenSSL

安装完成后,搜索openssl后打开。
在这里插入图片描述

切换到证书目录, 执行如下命令:

openssl x509 -in my.cer -inform der -text -noout

证书的文本显示的效果如下:
在这里插入图片描述

从证书可以查看到公钥和私钥的数字签名, 那么如何获取私钥呢, 在Java中,可以通过API进行获取。

参考



  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:56:30  更:2022-03-16 22:57:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 15:35:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码