什么是通讯的安全性?考虑通讯的几个要素:对方通过一条线路发送信息。
对方:如何判断对方身份真实性(伪装)?
信息:如何保证信息不被窃听和篡改?
防窃听,防篡改,防伪装,是总的需求。
加密算法( 明文, 密钥K ) => 密文; 解密算法( 密文, 密钥K ) => 明文
例如:余则成(老余)和上级通讯,双方约定了秘钥K。
老余加密信息:加密算法( “我是老余”, 秘钥K ) => “D%8V#1=”
老余发送信息:“D%8V#1=”
上级接收信息:“D%8V#1=”
上级解密信息:解密算法(“D%8V#1=”, 秘钥K ) => “我是老余”
敌人窃听到”我是老余”,说明秘钥K泄漏(假设加密算法不可破解)。那么秘钥是谁泄漏的呢?秘钥K老余和上级都保存着,至少有两个泄漏点(如果地下网的N的通讯站都使用秘钥K(同一个密码本), 则泄漏点有N个可能)。排除秘钥K的泄漏原因将十分困难,每一个干系人都会极力否认自己与秘钥泄漏有关。
敌人可以伪装老余,例如发送”请求与上级接头”这样的信息
无法容忍这种事情发生,就要在技术上做改进。
把单一的秘钥K分裂成两个,一个公钥G,一个私钥P
加密算法( 明文, 私钥P ) => 密文; 解密算法( 密文, 公钥G ) => 明文
或者
加密算法( 明文, 公钥G ) => 密文; 解密算法( 密文, 私钥P ) => 明文
私钥P只有老余一个人保存,公钥G由上级保存。
老余加密信息:加密算法( “我是老余”, 私钥P ) => “D%8V#1=”
老余发送信息:“D%8V#1=”
上级接收信息:“D%8V#1=”
上级解密信息:解密算法(“D%8V#1=”, 公钥G ) => “我是老余”
老余无法否认”我是老余”这条信息与自己有关(要么是老余发送的,要么是老余把私钥泄露给敌人,敌人伪装发送)
上级加密信息:加密算法( “请求接头”, 公钥G ) => “D%8V#1=”
上级发送信息:“D%8V#1=”
老余接收信息:“D%8V#1=”
老余解密信息:解密算法(“D%8V#1=”, 私钥P ) => “请求接头”
这条信息只有老余才能解密,因为老余唯一持有解密用的秘钥P。如果消息被敌人窃听,只有两个泄漏点,其它持有老余公钥G的人是无法解密的。
非对称加密具有一定改进的防伪装,防窃听功能。
秘钥分发和保管仍是安全管理难题。老余需要保管自己的私钥P和上级的公钥G,至少两把秘钥。上级需要保管自己的私钥P和老余的公钥G两把秘钥。假设老余的住宅被敌人潜入后替换了上级公钥G为敌人的公钥g(对应敌人的私钥p)。
敌人加密信息:加密算法( “请求接头”, 私钥p ) => “D%8V#1=”
敌人发送信息:“D%8V#1=”
老余接收信息:“D%8V#1=”
老余解密信息:解密算法(“D%8V#1=”, 公钥g ) => “请求接头”
老余以为公钥g是上级的(实际不是),老余认为上级要接头,就出现了危险。
用私钥加密的数据,发送方无法否认。因为只有发送方唯一拥有私钥。签名的本质是: 信息只能由唯一的实体创建,这条信息就是这个实体的签名。私钥主要用来做数字签名。私钥做数据正文加密,没有多少优势,因为有N个人持有公钥,泄露点不好排查
发送方的信息,通过某种算法(哈希),把大段信息生成小段信息(类似长篇论文, 前面的小段摘要信息),然后用私钥加密。看来数字摘要肯定能属于数字签名概念。区别是,接收方可以根据数字摘要判断信息是否被篡改过。
发送方: 加密算法(明文)=> 密文
发送方: 哈希算法(明文)=> 明文摘要1
发送方: 加密算法(明文摘要1, 私钥P)=> 数字摘要
发送方: 发送密文,发送数字摘要
接收方: 获得明文
接收方: 哈希算法(明文)=> 明文摘要2
接收方: 解密算法(数字摘要, 公钥G)=>明文摘要1
接收方: 如果明文摘要1 等于 明文摘要2,则无篡改。
证书认证:
Browser请求与Server通讯。Browser比较关心Server是否是钓鱼网站,搜集自己的信用卡账号和密码。Server把一个证书C(内容Server的公钥,发证机构A,颁发给域名,过期日期,数字摘要……)Server告诉Brower:我是有权威机构认证的诚信网站。Brower想,你当我傻吗,说真的就是真的,我要去调查一下。Brower在本机上找到发证机构A的公钥。目的是验证数字摘要是否合法。如果合法,说明证书C未被篡改,而且是发证机构A签名的。Brower放心了证书是真的,然后根据证书检查一下:证书过期了吗?颁发给域名是否与server一致等。
发证机构A的公钥是哪里来的?全世界就那么几十号上百号权威发证机构, 浏览器或操作系统已经预先保存了所有权威发证机构的公钥。如果浏览器被黑,这个事就挂了。虽然Browser无需存储网站的公钥,要存储发证机构的公钥。
对称秘钥协商:
Brower:随机生成对称加密的秘钥P。
Brower:加密算法(”秘钥P”, Sever的公钥)=> “D%8V#1=”
把”秘钥P”当做被加密的明文
Server: 解密算法(” D%8V#1=”, Sever的私钥)=> 秘钥P
现在,server和browser可以用秘钥P进行对称加密会话了。每次请求,可以更换一次秘钥P,这样变来变去,黑客没有时间破解。而且,对称加密算法速度快,让业务更流畅的运行。真是一举多得。
Brower不用保存一大堆网站的公钥了,安全性多了很多。
Server要保存好自己的私钥和自己的公钥(2个字符串)。这些是从权威机构认证CA获取的,需要配置在server的电脑里。而且每年要交一些服务费给权威认证机构。