公钥与私钥
为什么需要加密
- 当小羊登录qq时输入自己的账号密码,点击了登录,显然,小羊不希望账号密码被垂涎自己(账号密码)的哥哥得到,但是很不幸的是,在小羊点击登录时,账号和密码将会被发送到服务器做验证,这些信息传输过程中,羊宝的哥哥是很容易被截取的
- 既然信息很容易就能被截取,那么最好的解决办法显然是对发送的信息进行加密,即使有人截取了你发送向网站的账户密码信息,这些信息因为是加密的,所以得到他们和没有是一个效果(其实并非没有效果,下面将继续用这个例子来完善ssl系统的原理)
对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥
加密。
- 比如将每个字符(的ascll)向后移动一位,将a转换为b,将c转换为d,这样原信息ac被转化为bd,这是一次加密的过程,当持有加密信息bd的人得到加密方法(字符后移一位)后,就可以以此解密bd,得到ac(原信息),这种加密方式就是对称加密
- 然而ssl系统中的加密方式并不是对称加密,我们先来讨论一下为什么不用对称加密
- 还是上面的例子,小羊将自己加密后的账号密码信息发送给了qq服务器,qq拿到了加密后的信息开始感觉很迷了,加密方式有很多,qq怎么知道羊宝用的是什么加密方式呢,于是羊宝只能将加密方式附在向qq发送的信息中,然而羊宝他哥截取了信息后,使用信息中附带的加密方式(密钥),轻松的解了密.
- 聪明的小羊想到可以和qq提前约定好加密的方式,就不用发送加密方式(密钥)了,但是qq的用户很多,给每个用户约定一种他们心仪的加密方式显然是不可能的,所以羊宝他哥和qq传输信息的加密方式和羊宝是一样的,羊宝哥哥只需要截取自己加密后的信息,再和原信息比对,就能得到加密方式(密钥),再用密钥就能得到羊宝(的qq密码)了
与非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是
一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法
叫作非对称加密算法。
- 简单来说,使用1号密钥加密信息,只能由2号密钥解密信息(1号密钥也无法解密),这就是非对称加密
- 小羊学会了非对称加密,成功地安全登录了qq,他要求qq接收密码之前先给自己发送1号密钥,自己用1号密钥将信息加密,传输给了qq,qq用自己藏起来的2号密钥解密就得到了账号和密码.在这个过程中,哥哥只能截取了羊宝的加密信息和1号密钥,无法得到qq藏起来的2号密钥,就无法解密羊宝的加密信息了
签名与hash
为什么需要签名
- 哥哥能这么轻易放过羊宝吗?既然只能得到加密信息,哥哥决定伪造自己就是qq网站,向小羊发送了填写账号密码的请求,小羊差点中招,心有余悸的他想要找一种办法验证信息是否来源于qq
摘要算法(hash)
摘要算法是单向算法,明文只能转换成密文,密文却无法转换成明文,这种算法也叫HASH算法,如SHA1,MD5,CRC,SHA256
等。可以这样理解,几乎很难找到两个不同的明文能生成同一个摘要。所以摘要算法能够用于验证数据的完整性,防篡改。
- 信息被hash算法处理后会得到一个密文(hash值),这段密文(hash值)具有以下特点
- 无法反向操作得到原信息
- 在同种算法处理时,同一段信息肯定会得到同样的密文(hash值)
- 在同种算法处理时,不同信息得到的密文(hash值)是肯定不同的
- 基于以上特点,hash算法通常用于校验文件的完整性,如果文件的内容被篡改,就会导致现在的hash值和被篡改前的hash值不同,让人知道这个文件被篡改过,比如小羊写了个软件,生成了软件的hash值,将hash值公布了出去,因为hash值无法反向得到原信息,小羊不用担心有人根据hash值反推出软件源代码,并且别人下载使用软件时,可以了利用工具查看软件的hash值,如果和小羊公布的的不一样,说明该软件被人篡改过了
数字签名
数字签名的计算方法:算出内容HASH值,然后用私钥加密,这就是数字签名。
客户收到信息后,用公钥解密数字签名得到HASH值,然后算出内容的HASH值,两者相对比。
- 回到上面的例子,qq将自己给小羊发送的信息生成hash值,使用qq的私钥(藏着的2号密钥)对hash值加密,小羊收到信息后用公钥(qq公开的1号密钥)对信息解密,得到的内容生成时的hash值,再与自己接收到的内容的hash值进行比对,一致则说明信息来源于qq,并且哥哥没有篡改里面的内容
- 当哥哥再次伪造内容时,使用哥哥自己的私钥(qq的私钥只有qq自己有)加密了自己的hash,发送给羊宝,羊宝接收到加密的hash,用qq的公钥去解密,发现无法解密,数字签名失效,得知了信息不是由qq发出的,就没有理会.
- 哥哥又尝试了篡改qq的信息,羊宝解密了qq信息本来应该有的hash,发现与接收到qq信息的hash值不一样,数字签名异常,得知信息被篡改了
数字证书
为什么需要数字证书
- 羊宝的哥哥想到一个好办法,来自qq的信息无法伪造,窃取的信息自己无法解密都是因为ssl系统,而在整个传输过程中自己能控制的就只有向所有人公开的公钥了(上面的1号密钥)
- qq向羊宝发送信息时携带了公钥,哥哥将qq的公钥替换为自己的公钥,再将自己伪造成qq网站,用哥哥自己的私钥进行数字签名,数字签名由哥哥的私钥和哥哥的信息生成,羊宝持有的公钥也是哥哥的,导致羊宝不知道自己的公钥被替换的情况下误以为哥哥的网站是真的qq网站
- 小羊需要一种方法来验证自己拿到的公钥到底是qq的还是哥哥的,最后,数字证书登场了
数字证书原理
CA会用我的的私钥加密我的原文哈希值(摘要)并带上我的公钥,再用它的公钥整体加密形成数字证书,这个目的,由于使
用的是私钥加密,公钥就可以解密,于是我将这个证书追加到我的原文后面
- 简单来说,数字证书重复了数字签名的步骤,只不过签名者换成了ca,签名对象换成了公钥
- ca机构使用自己的(藏起来的)私钥,对qq的公钥和qq网站的相关信息加密,当小羊收到qq的信息时,用ca公布的公钥,对加密的信息进行解密,再拿到qq的公钥,这段加密信息就是数字证书
- 当哥哥拦截到qq发送给羊宝的公钥并且去替换成自己的时候,就需要让自己的网站和公钥被ca机构加密,再将自己的数字证书代替qq的数字证书发送给羊宝,然而羊宝只需要用ca的公钥解密,就会发现网站信息与qq的网站信息与得到的网站信息不符,就知道信息被哥哥篡改了
自签名证书
- 如果你的逻辑没有混乱的话,应该会发现数字证书还有一个致命的问题,既然数字签名可以用公钥替换的方式来伪造,那么也可以伪造ca机构的公钥,将ca的公钥替换成信息窃取者的公钥,再使用窃取者自己的私钥加密信息得到数字证书,导致数字证书也被伪造
- 以上的过程就是自签名证书,比如上一篇提到的windows下为frp生成ssl证书就是自签名证书
- 解决此问题的方法其实也十分简单:全球的ca机构就只有那么几家,让所有浏览器都存储着ca的公钥就可以了,那么伪造公钥的层面就不是攻击通讯层面的问题了,而是需要攻击计算机系统并修改默认的信任证书,和ssl显然没有关系了
- 同时这也解释了为什么浏览器在使用自签名证书的时候会提示不安全,如果你信任了窃取者的ca,窃取者就可以使用被信任的公钥伪造其他网站ca的公钥,来伪造其他网站的通讯
证书链
- 上面提到ca机构的公钥可以给其他网站(a网站)的公钥加密,那么被ca加密的数字证书持有网站(a网站)也是有公钥和私钥的,这时候,a网站就可以做一个ca的角色,用自己的公钥给b网站的公钥和私钥和网站信息加密,生成b的数字证书,a就成了b数字证书的ca,同样的,b也可以给c颁发证书,c可以给d,,,,,
- 当小羊要验证网站d的数字证书的时候,会根据数字证书的信息向数字证书的签发机构网站c验证d的数字证书,发现c的证书是b签的,那就再向b验证c是否合法,结果又发现b的证书又是a签的,无论是b,c还是d的证书都不是权威ca机构签的,导致浏览器里面没有存储b,c,d的公钥,这些证书在浏览器看来都是不合法的,就会根据数字证书的信息向上级签发机构询问,直到询问到权威ca机构的证书认为证书链合法,或者发现最后一级签发机构也是自签名,否定整个证书链
- 在这个例子中,权威ca签a的证书,a签b的证书,b签c的证书,就是一个证书链
后来的故事
- 羊宝还是将qq密码给了垂涎自己(qq)已久的哥哥,但是他们的故事远远没有结束,就像ssl的发展,谁也不知道未来是否还有比ssl更优秀的信息安全传输方案,我期待着ssl的发展,一如期待着属于和羊宝的更精彩的故事.