公钥、私钥、数字签名和数字证书的概念及解密
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进行获取。
参考
- 数字签名与数字证书
- SSL/TLS 工具 OpenSSL
公钥、私钥、数字签名和数字证书的概念及解密相关推荐
- 私钥、公钥、数字签名、数字证书、HTTPS
加密:公钥加密,私钥解密 认证:私钥加密,公钥解密 如果A给B发送一个加密的有数字签名的文件,会怎么样呢? 首先A有自己的公钥和私钥:A_public_key, A_private ...
- PKI-2-数字签名和数字证书的概念
在PKI-1中提到了加解密,还有非对称算法中公钥和密钥的概念,那么什么是数字签名.数字证书呢 我们先讨论一个场景,有一对情侣分别在遥远的西伯利亚和北京:男生A拿着自己的私钥对情书进行加密,然后通过公共 ...
- 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)
网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...
- 加密、解密、数字签名和数字证书概念详解
1. 概述 随着电子商务的迅速发展,信息安全已成为焦点问题之一,尤其是网上支付和网络银行对信息安全的要求显得更为突出.为了能在因特网上开展安全的电子商务活动,公开密钥基础设施(PKI, Public ...
- PKI(公、私钥加密,数字签名、数字证书)技术理解
PKI(公.私钥加密,数字签名.数字证书) 1.PKI概述 名称:Public Key Infrastructure 公钥基础设施 作用:通过加密技术和数字签名保证信息的安全 组成:公钥加密技术.数 ...
- 数字签名与数字证书是什么
目录 概述 数字签名 数字签名是什么 数字签名的大概流程 发件人 收件人 签名的安全风险 数字证书 为什么需要数字证书 数字证书是什么 数字证书的应用场景 使用流程 概述 了解数字签名和数字证书之前, ...
- 数字证书的概念以及作用
1.1 数字证书的概念以及作用 数字证书又称为数字标识,是标志网络用户身份信息的一系列数据.它提供了一种在互联网上身份验证的方式,是用来标志和证明网络通信双方身份的数字信息文件.通俗地讲,数 ...
- 【数据安全】一、通俗理解数字签名,数字证书和https
通俗理解数字签名,数字证书和https 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应.签章有法律效应必须满足两个条件: 能够证明签名,盖 ...
- 图解 | 数字签名和数字证书的前世今生
" 阅读本文大概需要 6 分钟. " 前言 这是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频. 在一旁玩手机的女朋友突然问"你知道数 ...
最新文章
- Select多路复用
- solr通过连接数据库删除document 总结
- idea 建nodejs 项目_三种方法带你新建SpringBoot项目
- 第七届开源操作系统年度技术会议(OS2ATC)盛大开幕,从编译器到软件定义卫星精彩议题大曝光!...
- python 图书馆管理程序下载_图书管理系统 免费开源代码 开发,分享 - CodeForge.cn...
- 6个残酷的人生事实[转]
- Excel VBA数组使用方法
- 2021年荷兰经济发展研究报告
- 神经网络的双曲线正切激活函数
- 用word写小论文时如何实现两栏格式公式居中,编号右对齐
- 基于STM32C8T6的MLX90614-DCC红外无线测温系统
- 去掉电脑桌面图标中的箭头图标
- PC端工具 WP7 PC端截图工具WP7 Screen recorder 发布 附使用教程
- 手把手教你做一个天气时钟,推荐收藏
- label 字体添加中划线和下划线
- 西游记中孙悟空的等级地位
- Java【多线程】笔记总结
- 计算机网络安全所学知识大纲,计算机网络安全课程教学大纲.doc
- Jupyter Notebook基础知识总结
- 画个板子玩玩最便宜的Arduino,Atmega8A 的使用
热门文章
- MySQL 5.7.18的安装与主从复制
- ASP.NET MVC RedirectToRoute类[转]
- vbs 一些学习资料
- vsftp 一键安装包
- Centos 6.5-yum安装出现错误解决方案
- 【干货】2021中国“企服企业”规模化获客体系建设指南.pdf(附下载链接)
- 【报告分享】2020年中国智慧城市发展研究报告.pdf(附下载链接)
- 软件设计师学习1——计算机系统知识
- js已知文件路径得到file对象_NodeJs 的几种文件路径
- python函数递归求和详解_Python 递归函数详解及实例