密码那点事情
Posted 一介闲休
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码那点事情相关的知识,希望对你有一定的参考价值。
在了解密码相关事情的时候,不得不谈论三种人:
接收者,发送者,窃听者
就是考虑发送者和接收者发送的信息可能被窃听者截获,因此就需要对内容进行加密,由此上图就变成下面这样。
谈到加密,那我们就要思考:
如何确保发送内容的安全性(机密性)
上图中我们采用了同一个密钥对消息进行加密和解密,尽管该场景可以满足加密和解密需求,但是发送者和接收者如何确保保证它们之间密钥一样,是发送者传递给接收者吗?那怎么将密钥从发送者手上传递到接收者?如果可以安全传递,那信息是否也可以安全传递了,那何必还要密钥呢?这无疑就涉及到密钥配送问题
这样方式我们就叫它为对称密码,也就是说加密和解密用到的就是一个密钥(经典对称密码算法DES)
优点:加密解密速度快
缺点:密钥配送问题
考虑到对称密码的密钥配送问题,因此就出现了公钥密码,公钥密码就是解密和加密分别是不同密钥,也就是说由接收者生成一个密钥对:公钥和私钥,私钥自己保留,公钥给发送者,当发送者拿到接收者的公钥后,就用它加密消息,然后发送给接收者,接收者再采用私钥解密就可以看到密文,这样就算公钥被窃听者拿到也没有什么作用。现以Bob向Alice发送消息为例:
公钥密码主要算法是RSA
优点:不存在密钥配送问题
缺点:加密/解密速度是对称算法的几百分之一,难以抵御窃听者攻击
为了利用对称密码和公钥密码的各自优势,因此又涌出混合密码系统,它的方式如下:
- 用对称密码加密消息
- 通过伪随机数生成器生成对称密码加密中使用的会话密钥
- 用公钥密码加密会话密钥
- 从混合密码系统外部赋予公钥密码加密时使用的密钥
值得注意点就是:会话密钥是对称密码的密钥,同时也是公钥密码的明文
如何确保内容的完整性
完整性即一致性,就是接收者要确定所接收到的内容就是发送者发送的内容,且内容没有在中途被修改,那如何保证?
可以选择单向散列函数,那什么是单向散列函数?
单向散列函数:它有一个输入和一个输出,输入称为消息,输出称为散列值,单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性,如:SHA-1
单向散列函数具备的性质:- 根据任何长度的消息计算出固定长度的散列值;
- 能够快速计算出散列值;
- 消息不同散列值也不同
此外,它还具备单向性,它并不同于加密算法,因此无法通过解密将散列值还原为原来的消息。
尽管单向散列函数可以确定内容的完整性,但在这样的场景下,它无法满足。
假设主动攻击者M伪装发送者A,向接收者B发送了消息和散列值,这是B能够通过单向散列函数检查消息的完整性,但是这只是对M发送的消息进行检查,而无法检查出发送者的身份A是否被M伪装了,也就是说单向散列函数能够辨别出修改,但是无法辨别出伪装。
为解决单向散列函数无法解决的问题,因此出现了认证,认证主要包括消息验证码和数字签名
如何辨别“伪装”
辨别伪装,我们可以采用消息认证码技术来进行认证
消息认证码:它是一种确认完整性并进行认证的技术(MAC),消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数值成为MAC值。
该方案面临着与对称密码相同的问题,就是密钥配送问题,此外,尽管消息认证码能识别消息被修改和伪装的情况,但是对“对第三方证明”和“防止否认”这问题均无法解决,场景如下:假设A和B通信,且发送一条消息M,现在B要向C去证明,M是A发送的,但是通过消息认证码,只能确定计算出M的MAC值是对的,但是该值可以是A和B发送,因此无法证明消息一定是A发送也可能是自身,就算C相信M是A发送,然后去问A,但是A否认该消息M是它发送的,此时B也是无赖。因此,向第三方证明或防止否认,消息认证码根本做不到
如何向第三方证明或防止否认
为向第三方证明或防止否认,就只能靠数字签名了,它是一种将相当于现实世界中的盖章,签字的功能在计算机世界中进行实现的技术,使用数字签名可以识别修改和伪装,还可以防止否认,能确定消息究竟是谁写。
数字签名技术中两种行为:
- 生成消息签名的行为
- 验证消息签名的行为
生成消息签名:这一行为是由消息的发送者完成,即对消息签名,生成签名就是根据消息内容计算数字签名的值
验证数字签名:由接收者完成,但是也可以由需要验证消息的第三方来完成
上述为加密/解密过程,其实和签名/验证过程类似,只是将公钥私钥功能反向而已
具体的签名验证过程如下:
使用数字签名有个前提,就是公钥必须属于真正的发送者,为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥
如何确保公钥合法性
确保公钥合法性,就需要公钥证书
证书:为公钥加上数字签名,公钥证书其实和驾照很相似,里面记录了个人信息,并由认证机构施加数字签名,只要看到公钥证书,就可以确认该公钥属于此人,公钥证书也称为证书
下面就证书使用场景的步骤做如下说明:
证书的应用场景:发送方A,接收方B,认证机构T
- A先生成密钥对,私钥由自己保管
- A把公钥发送给T,T收到公钥后会确认是不是A本人所有
- T用自己私钥对A的公钥进行数字签名生成证书
- B得到带有T签名的A的公钥(证书)
- B使用T的公钥验证签名,确认A公钥的合法性
- B使用A的公钥加密消息并发送给A
- A收到B的密文后解密得到明文
至此,密码内容已完成,总结如下:
最后说明点:
目前互联网上发生的流量劫持基本是两种手段来实现的:
域名劫持:通过劫持掉域名的DNS解析结果,将HTTP请求劫持到特定IP上,使得客户端和攻击者的服务器建立TCP连接,而不是和目标服务器直接连接,这样攻击者可以对内容进行窃取或篡改。在极端的情况下甚至攻击者可能伪造目标网站页面进行钓鱼攻击。
直接流量修改:在数据通路上对页面进行固定的内容插入,比如广告弹窗等。在这种情况下,虽然客户端和服务器是直接建立的连接,但是数据内容依然可能遭到野蛮破坏。
能够实施流量劫持的根本原因,是HTTP协议没有办法对通信对方的身份进行校验以及对数据完整性进行校验。如果能解决这个问题,则流量劫持将无法轻易发生。解决方式可以通过https,https就是增加了对服务器认证。
以上是关于密码那点事情的主要内容,如果未能解决你的问题,请参考以下文章