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


公钥、私钥、数字签名和数字证书的概念及解密相关推荐

  1. 私钥、公钥、数字签名、数字证书、HTTPS

         加密:公钥加密,私钥解密      认证:私钥加密,公钥解密 如果A给B发送一个加密的有数字签名的文件,会怎么样呢? 首先A有自己的公钥和私钥:A_public_key, A_private ...

  2. PKI-2-数字签名和数字证书的概念

    在PKI-1中提到了加解密,还有非对称算法中公钥和密钥的概念,那么什么是数字签名.数字证书呢 我们先讨论一个场景,有一对情侣分别在遥远的西伯利亚和北京:男生A拿着自己的私钥对情书进行加密,然后通过公共 ...

  3. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  4. 加密、解密、数字签名和数字证书概念详解

    1.  概述 随着电子商务的迅速发展,信息安全已成为焦点问题之一,尤其是网上支付和网络银行对信息安全的要求显得更为突出.为了能在因特网上开展安全的电子商务活动,公开密钥基础设施(PKI, Public ...

  5. PKI(公、私钥加密,数字签名、数字证书)技术理解

    PKI(公.私钥加密,数字签名.数字证书) 1.PKI概述 名称:Public Key Infrastructure  公钥基础设施 作用:通过加密技术和数字签名保证信息的安全 组成:公钥加密技术.数 ...

  6. 数字签名与数字证书是什么

    目录 概述 数字签名 数字签名是什么 数字签名的大概流程 发件人 收件人 签名的安全风险 数字证书 为什么需要数字证书 数字证书是什么 数字证书的应用场景 使用流程 概述 了解数字签名和数字证书之前, ...

  7. 数字证书的概念以及作用

    1.1 数字证书的概念以及作用      数字证书又称为数字标识,是标志网络用户身份信息的一系列数据.它提供了一种在互联网上身份验证的方式,是用来标志和证明网络通信双方身份的数字信息文件.通俗地讲,数 ...

  8. 【数据安全】一、通俗理解数字签名,数字证书和https

    通俗理解数字签名,数字证书和https 前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应.签章有法律效应必须满足两个条件: 能够证明签名,盖 ...

  9. 图解 | 数字签名和数字证书的前世今生

    " 阅读本文大概需要 6 分钟. " 前言 这是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频. 在一旁玩手机的女朋友突然问"你知道数 ...

最新文章

  1. Select多路复用
  2. solr通过连接数据库删除document 总结
  3. idea 建nodejs 项目_三种方法带你新建SpringBoot项目
  4. 第七届开源操作系统年度技术会议(OS2ATC)盛大开幕,从编译器到软件定义卫星精彩议题大曝光!...
  5. python 图书馆管理程序下载_图书管理系统 免费开源代码 开发,分享 - CodeForge.cn...
  6. 6个残酷的人生事实[转]
  7. Excel VBA数组使用方法
  8. 2021年荷兰经济发展研究报告
  9. 神经网络的双曲线正切激活函数
  10. 用word写小论文时如何实现两栏格式公式居中,编号右对齐
  11. 基于STM32C8T6的MLX90614-DCC红外无线测温系统
  12. 去掉电脑桌面图标中的箭头图标
  13. PC端工具 WP7 PC端截图工具WP7 Screen recorder 发布 附使用教程
  14. 手把手教你做一个天气时钟,推荐收藏
  15. label 字体添加中划线和下划线
  16. 西游记中孙悟空的等级地位
  17. Java【多线程】笔记总结
  18. 计算机网络安全所学知识大纲,计算机网络安全课程教学大纲.doc
  19. Jupyter Notebook基础知识总结
  20. 画个板子玩玩最便宜的Arduino,Atmega8A 的使用

热门文章

  1. MySQL 5.7.18的安装与主从复制
  2. ASP.NET MVC RedirectToRoute类[转]
  3. vbs 一些学习资料
  4. vsftp 一键安装包
  5. Centos 6.5-yum安装出现错误解决方案
  6. 【干货】2021中国“企服企业”规模化获客体系建设指南.pdf(附下载链接)
  7. 【报告分享】2020年中国智慧城市发展研究报告.pdf(附下载链接)
  8. 软件设计师学习1——计算机系统知识
  9. js已知文件路径得到file对象_NodeJs 的几种文件路径
  10. python函数递归求和详解_Python 递归函数详解及实例