基于 PKI(公钥密码学)的详细认证方案
1. 定义
为了能够更有效地运用公钥而制定的一系列规范和规格的总称,这是一种广泛的定义,但是往往在论文中指定一个特定的形式也就是下面所讲的形式,但是这种形式也是一种总称
注意:
- 下面模型都是基于身份的认证协议的PKI,这是一种特定的PKI模型;但实质上PKI是广义的,只要是为了解决公钥密码*而建立的一套机制都可以统称为PKI,所以我们目的并不是讲全一个PKI,其旨在于通过其让你明白大致的PKI应该是个什么样的模型。
- 用户向认证机构进行注册,认证机构生成公私钥的话,认证机构肯定也会将私钥发送给用户,但是如果是用户自己生成公私钥的话就不用认证机构进行发送;所以当别人申请下载证书的时候,认证机构就会发放对应的公钥。
2. 组成
2.1 用户
使用PKI的人,分类如下:
- 注册公钥的用户,他们所做的操作的如下:
- 在认证机构注册公钥;
- 向认证机构申请证书;
- 根据需要申请作废已注册的公钥
- 解密接收到的密文;
- 对消息进行数字签名
- 使用已经注册的公钥的用户,他们所做的操作如下:
- 将消息加密后发送给接收者;
- 验证数字签名;
2.2 认证机构
颁发证书的人,对证书进行管理,进行如下操作:
- 生成秘钥对;
- 在注册公钥时对本人身份进行认证;
- 生成并颁发证书;
- 作废证书;
2.2.1 认证机构的工作
- 生成秘钥对,有两种方式:
- PKI用户自行生成;
- 认证机构来生成,这种方式认证机构就需要把私钥发送给用户;
- 注册证书:
- 如果是PKI用户自行生成秘钥对,那么它在这个阶段就会请求认证机构生成证书
- 作废证书以及CRL
- 当用户的私钥丢失、被盗的时候,认证机构需要对证书进行作废,注意:此时即使秘钥安全无恙也是需要对证书进行作废,因为存在潜在的威胁,你无法去做出一个肯定的判断;
- 需要制作一张证书作废清单CRL,并且对这个清单加上数字签名;
- 查询:用户需要从认证机构获取最新的CRL,并查询自己要用于验证签名(或用于加密)的公钥是否作废。
2.3 仓库
保存证书的数据库
- 也叫证书目录
3. 证书——PKI围绕的主体
3.1 证书的层级(组成)
证书的作用:认证机构对用户的公钥进行了数字签名,并生成了证书,验证该数字签名的证书由认证机构进行携带一起进行发放,通过公钥去验证此公钥是否就是认证机构所发公钥,不能让人进行篡改;
那么要做到足够的可信度就需要做到下图所示几点:
任何机构都可以成为认证机构,只要对公钥进行数字签名就是,所以当你得到一个数字签名的时候,需要做的就是确认对公钥签名的认证机构就是你想要认证的认证机构。
3.2 对证书的攻击:
3.2.1 在公钥注册之前攻击
- 秘钥对的生成方法有两种:1.由用户自己生成了秘钥对,然后在去认证机构进行注册;2.通过向认证机构注册,由认证机构进行秘钥对的生成并分发。
- 注意到如果由第一种生成方法,期间就会有一个传传送过程,有传送过程就有可能导致对其他人进行替换和篡改,将公钥换成攻击者的最后变成攻击者的公钥+用户的个人信息,这样就会造成其他用户要和该用户进行通信的时候公私钥就会对应不上。
3.2.2 注册相似人名进行攻击
- 我们需要理解的是:最后的签名信息以及相关认证机构的信息是给人看的,而不是用机器去验证即使是通过机器验证你也需要去选择对应的身份信息,所以身份是需要我们进行输入或者选择选择的,如果有人特意让两个身份很相似,那么人们在选择的时候就容易选错;
- 相似的身份信息示例(主要利用英文字母中大小写来迷惑,其中中文也有类似,比如→中和申):
- Bob和BoB
- Alice和ALice
3.2.3 窃取认证机构的私钥进行攻击
- 如果从技术上窃取认证机构的私钥是很难的,因为认证机构主要做的就是这方面的保护。但是其实就像现实中的黑客去拿到你的信息并不需要很强的技术性,其实他是通过强大的社交网,就像这里它可以通过和认证机构内部人员打通关系或者本身就是内部人员,从而获得认证机构的私钥,这就是我们经常说的——社会学
3.2.4 攻击者伪装成认证机构进行攻击
- 前面我们讲到每一个人都可以去成为认证机构,只要是它对公钥进行了数字签名并且能对申请注册的以及申请使用的做出常规的响应;对应到现实中就是运营认证机构不需要做其他多余的事情,只要有运营认证的软件就行
- 正因为成为认证机构的要求简单,所以当你收到认证机构的数字签名的时候需要对照是否是对应的认证机构,防止一些人冒充。
3.2.5 钻CRL的空子进行攻击1/2:
主要还是通过CRL列表发布更新的时间差来进行违规操作
这里我们需要理解的是:用户的公钥失效向认证机构申请CRL更新,这个更新需要时间,但是同时查询却有可能在同时发生,于是你查询的可能未必是你想要的结果
1. 第一种钻空子的方法:
- 攻击者入侵电脑导致私钥被盗,当你想向认证机构进行CRL有效性的查询的时候,此时可能此时CRL废弃清单并没有发布更新,因为当收到用户说自己公钥失效的时候认证机构需要做相应的处理,并且更新CRL也是需要实践,所以此时查询的可能是之前没有更新的,这就导致转的钱就用来私钥进行签名,这就导致了攻击者可以对其进行盗取
- 暂时并没有一个很好的办法去解决,唯一的只是去有效的减少这类事件的发生,其做法如下:
- 当公钥失效时尽快通知认证机构;
- 尽快发布CRL;
- 及时更新CRL;
2. 第二种钻空子的方法:
- A开两个账户,另外一个用来实际转钱,让别人转钱给你,但地址却指向另外一个账户,在别人转的时候就会转给另一个账户,然后自己却申请公钥失效,之所以申请公钥失效是为了之后迷惑别人说是自己没收到钱然后别人一看公钥还真失效了,所以为什么转得时候也检查了CRL,为什么那时候就没有失效呢?这是由于CRl更新的时间差;
- 这里就是通过时间差这件事掩盖住了别人本身将钱转出去了而且转给了A的口袋中。
-
解决方案:将签名时间与作废时间对比。
- 按照所说情况:作废时间是在签名之前的
- 实际情况:作废时间是在签名之前
- 依旧存在的问题:这种情况可能会一段时间才会察觉到
-
解决方案:将签名时间与作废时间对比。
3.3 攻击的示例:
3.3.1 Superfish(相当于从用户那里盗取了公私钥)
联想笔记本用户从去年年中开始在官方论坛上报告他们的电脑预装了广告软件Superfish,Superfish会在用户电脑上安装自签名证书,劫持用户浏览的HTTPS/HTTP网页,劫持搜索结果,在Google搜索页面及其它网站上注入广告。在网络上发布签名可以畅通无阻,使得钓鱼网站就变得不能被识别出来,那么一旦用户亲信就会导致损失惨重。所以这件事告诉我们的结论就是用户去购买的产品知识硬件产品所携带的软件不一定是可信的,平时是需要注意预防这方面的病毒入侵的
3. 通过自己的方法进行认证是否可行以及认证机构可信的理由
通过自己的方法进行认证是否可行:自己开发保密的认证方法是犯了典型的隐秘式安全错误,公开的方法能够通过全世界的安全专家不断地区寻找错误
认证机构之所以可信:另外我们之所以信任某一个认证机构是因为那是基于多个可信的情报源做出的判断
参考文章
1.图解密码技术.第10章.第六节
上一篇: 认证和加密(PKI)简介
推荐阅读
-
基于 PKI(公钥密码学)的详细认证方案
-
ssh工作流程及原理-SSH(Secure Shell Protocol,安全的壳程序协议),它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能:一个是类似telnet的远程连接使用shell的服务器;另一个就是类似ftp服务的sftp-server,提供更安全的ftp服务。 连接加密技术简介 目前常见的网络数据包加密技术通常是通过“非对称密钥系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程。 公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。 私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。 SSH工作过程:在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段: 版本号协商阶段 SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本 密钥和算法协商阶段 SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法 认证阶段 SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证 会话请求阶段 认证通过后,客户端向服务器端发送会话请求 交互会话阶段 会话请求通过后,服务器端和客户端进行信息的交互 一、版本协商阶段 服务器端打开端口22,等待客户端连接; 客户端向服务器端发起TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>.<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。 客户端收到报文后,解析该数据包,如果服务器的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。 客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。如果协商成功,则进入密钥和算法协商阶段,否则服务器断开TCP连接。 说明:上述报文都是采用明文方式传输。 二、密钥和算法协商阶段 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等等。 服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。 服务器端和客户端利用DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话ID。 由此,服务器端和客户端就取得了相同的会话密钥和会话ID。对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全。在认证阶段,两端会使用会话用于认证过程。 会话密钥的生成: 客户端需要使用适当的客户端程序来请求连接服务器,服务器将服务器的公钥发送给客户端。(服务器的公钥产生过程:服务器每次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*文件,若系统刚装完,由于没有这些公钥文件,因此sshd会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己所需要的私钥文件。) 服务器生成会话ID,并将会话ID发给客户端。 若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。 ****服务器用自己的私钥将收到的数据解密,获得会话密钥。 服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。 三、认证阶段 SSH提供两种认证方法: 基于口令的认证(password认证):客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败消息。 基于密钥的认证(publickey认证):客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的.ssh/authorized_keys文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。 注:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。实例
-
理解与实战:Java SSH库JSch - 用途解析、四大认证法、无密码登录设置、SSH公钥验证深入讲解、三种选择方案、SFTP文件传输详解、Maven集成及实用代码实例 - 专讲JSch在SFTP文件传输中的应用
-
理解公钥密码学:基于离散对数的加密机制 - 代数基础知识