说到密码,咱们第一个想到的就是登录帐户的密码,可是从密码学的角度来看,这种根本就不算合格的密码。git
为何呢,由于咱们的帐户密码,是依靠隐蔽性来达到加密做用:密码藏在我内心,你不知道,因此你登不上个人帐户。算法
然而密码技术认为,「保密」信息总有一天会被扒出来,因此加密算法不该该依靠「保密」来保证机密性,而应该作到:即使知道了加密算法,依然机关用尽。说的魔幻一点就是,告诉你个人密码,你依然不知道个人密码。浏览器
最玄学的就是 Diffie-Hellman 密钥交换算法,我当初就以为很惊奇,两我的当着你的面互相报几个数字,他们就能够拥有一个共同的秘密,而你却根本不可能算出来这个秘密。下文会着重介绍一下这个算法。安全
本文讨论的密码技术要解决的主要是信息传输中的加密和解密问题。要假设数据传输过程是不安全的,全部信息都在被窃听的,因此发送端要把信息加密,接收方收到信息以后,确定得知道如何解密。有意思的是,若是你可以让接收者知道如何解密,那么窃听者不是也可以知道如何解密了吗?服务器
PS:我认真写了 100 多篇原创,手把手刷 200 道力扣题目,所有发布在 labuladong的算法小抄,持续更新。建议收藏,按照个人文章顺序刷题,掌握各类算法套路后投再入题海就如鱼得水了。网络
下面,咱们会介绍对称加密算法、密钥交换算法、非对称加密算法、数字签名、公钥证书,看看解决安全传输问题的一路坎坷波折。app
对称性密码,也叫共享密钥密码,顾名思义,这种加密方式用相同的密钥进行加密和解密。ide
好比我说一种最简单的对称加密的方法。首先咱们知道信息均可以表示成 0/1 比特序列,也知道相同的两个比特序列作异或运算的结果为 0。函数
那么咱们就能够生成一个长度和原始信息同样的随机比特序列做为密钥,而后用它对原始信息作异或运算,就生成了密文。反之,再用该密钥对密文作一次异或运算,就能够恢复原始信息。网站
这是一个简单例子,不过有些过于简单,有不少问题。好比密钥的长度和原始信息彻底一致,若是原始信息很大,密钥也会同样大,并且生成大量真随机比特序列的计算开销也比较大。
固然,有不少更复杂优秀的对称加密算法解决了这些问题,好比 Rijndael 算法、三重 DES 算法等等。它们从算法上是无懈可击的,也就是拥有巨大的密钥空间,基本没法暴力破解,并且加密过程相对快速。
可是,一切对称加密算法的软肋在于密钥的配送。加密和解密用同一个密钥,发送方必须设法把密钥发送给接收方。若是窃听者有能力窃取密文,确定也能够窃取密钥,那么再无懈可击的算法依然不攻自破。
因此,下面介绍两种解决密钥配送问题最多见的算法,分别是 Diffie-Hellman 密钥交换算法和非对称加密算法。
咱们所说的密钥通常就是一个很大的数字,算法用这个数加密、解密。问题在于,信道是不安全的,全部发出的数据都会被窃取。换句话说,有没有一种办法,可以让两我的在众目睽睽之下,光明正大地交换一个秘密,把对称性密钥安全地送到接收方的手中?
Diffie-Hellman 密钥交换算法能够作到。准确的说,该算法并非把一个秘密安全地「送给」对方,而是经过一些共享的数字,双方「心中」各自「生成」了一个相同的秘密,并且双方的这个秘密,是第三方窃听者没法生成的。
也许这就是传说中的心有灵犀一点通吧。
这个算法规则不算复杂,你甚至均可以找个朋友尝试一下共享秘密,等会我会简单画出它的基本流程。在此以前,须要明确一个问题:并非全部运算都有逆运算。
最简单的例子就是咱们熟知的单向散列函数,给一个数字 a
和一个散列函数 f
,你能够很快计算出 f(a)
,可是若是给你 f(a)
和 f
,推出 a
是一件基本作不到的事。密钥交换算法之因此看起来如此玄幻,就是利用了这种不可逆的性质。
下面,看下密钥交换算法的流程是什么,按照命名惯例,准备执行密钥交换算法的双方称为 Alice 和 Bob,在网络中企图窃取他俩通讯内容的坏人称为 Hack 吧。
首先,Alice 和 Bob 协商出两个数字 N
和 G
做为生成元,固然协商过程能够被窃听者 Hack 窃取,因此我把这两个数画到中间,表明三方都知道:
如今 Alice 和 Bob 心中各自想一个数字出来,分别称为 A
和 B
吧:
如今 Alice 将本身内心的这个数字 A
和 G
经过某些运算得出一个数 AG
,而后发给 Bob;Bob 将本身内心的数 B
和 G
经过相同的运算得出一个数 BG
,而后发给 Alice:
如今的状况变成这样了:
注意,相似刚才举的散列函数的例子,知道 AG
和 G
,并不能反推出 A
是多少,BG
同理。
那么,Alice 能够经过 BG
和本身的 A
经过某些运算获得一个数 ABG
,Bob 也能够经过 AG
和本身的 B
经过某些运算获得 ABG
,这个数就是 Alice 和 Bob 共有的秘密。
而对于 Hack,能够窃取传输过程当中的 G
,AG
,BG
,可是因为计算不可逆,怎么都没法结合出 ABG
这个数字。
以上就是基本流程,至于具体的数字取值是有讲究的,运算方法在百度上很容易找到,限于篇幅我就不具体写了。
该算法能够在第三者窃听的前提下,算出一个别人没法算出的秘密做为对称性加密算法的密钥,开始对称加密的通讯。
对于该算法,Hack 又想到一种破解方法,不是窃听 Alice 和 Bob 的通讯数据,而是直接同时冒充 Alice 和 Bob 的身份,也就是咱们说的「中间人***」:
这样,双方根本没法察觉在和 Hack 共享秘密,后果就是 Hack 能够解密甚至修改数据。
可见,密钥交换算法也不算彻底解决了密钥配送问题,缺陷在于没法核实对方身份。因此密钥交换算法以前通常要核实对方身份,好比使用数字签名。
PS:我认真写了 100 多篇原创,手把手刷 200 道力扣题目,所有发布在 labuladong的算法小抄,持续更新。建议收藏,按照个人文章顺序刷题,掌握各类算法套路后投再入题海就如鱼得水了。
非对称加密的思路就是,干脆别偷偷摸摸传输密钥了,我把加密密钥和解密密钥分开,公钥用于加密,私钥用于解密。只把公钥传送给对方,而后对方开始给我发送加密的数据,我用私钥就能够解密。至于窃听者,拿到公钥和加密数据也没用,由于只有我手上的私钥才能解密。
能够这样想,私钥是钥匙,而公钥是锁,能够把锁公开出去,让别人把数据锁起来发给我;而钥匙必定要留在本身手里,用于解锁。咱们常见的 RSA 算法就是典型的非对称加密算法,具体实现比较复杂,我就不写了,网上不少资料。
在实际应用中,非对称性加密的运算速度要比对称性加密慢不少的,因此传输大量数据时,通常不会用公钥直接加密数据,而是加密对称性加密的密钥,传输给对方,而后双方使用对称性加密算法传输数据。
须要注意的是,相似 Diffie-Hellman 算法,非对称加密算法也没法肯定通讯双方的身份,依然会遭到中间人***。好比 Hack 拦截 Bob 发出的公钥,而后冒充 Bob 的身份给 Alice 发送本身的公钥,那么不知情的 Alice 就会把私密数据用 Hack 的公钥加密,Hack 能够经过私钥解密窃取。
那么,Diffie-Hellman 算法和 RSA 非对称加密算法均可以必定程度上解决密钥配送的问题,也具备相同的缺陷,两者的应用场景有什么区别呢?
简单来讲,根据两种算法的基本原理就能够看出来:
若是双方有一个对称加密方案,但愿加密通讯,并且不能让别人获得钥匙,那么可使用 Diffie-Hellman 算法交换密钥。
若是你但愿任何人均可以对信息加密,而只有你可以解密,那么就使用 RSA 非对称加密算法,公布公钥。
下面,咱们尝试着解决认证发送方身份的问题。
刚才说非对称加密,把公钥公开用于他人对数据加密而后发给你,只有用你手上对应的私钥才能将密文解密。其实,私钥也可用用来加密数据的,对于 RSA 算法,私钥加密的数据只有公钥才能解开。
数字签名也是利用了非对称性密钥的特性,可是和公钥加密彻底颠倒过来:仍然公布公钥,可是用你的私钥加密数据,而后把加密的数据公布出去,这就是数字签名。
你可能问,这有什么用,公钥能够解开私钥加密,我还加密发出去,不是画蛇添足吗?
是的,可是数字签名的做用原本就不是保证数据的机密性,而是证实你的身份,证实这些数据确实是由你本人发出的。
你想一想,你的私钥加密的数据,只有你的公钥才能解开,那么若是一份加密数据可以被你的公钥解开,不就说明这份数据是你(私钥持有者)本人发布的吗?
固然,加密数据仅仅是一个签名,签名应该和数据一同发出,具体流程应该是:
一、Bob 生成公钥和私钥,而后把公钥公布出去,私钥本身保留。
二、用私钥加密数据做为签名,而后将数据附带着签名一同发布出去。
三、Alice 收到数据和签名,须要检查此份数据是不是 Bob 所发出,因而用 Bob 以前发出的公钥尝试解密签名,将收到的数据和签名解密后的结果做对比,若是彻底相同,说明数据没被篡改,且确实由 Bob 发出。
为何 Alice 这么确定呢,毕竟数据和签名是两部分,均可以被掉包呀?缘由以下:
一、若是有人修改了数据,那么 Alice 解密签名以后,对比发现两者不一致,察觉出异常。
二、若是有人替换了签名,那么 Alice 用 Bob 的公钥只能解出一串乱码,显然和数据不一致。
三、也许有人企图修改数据,而后将修改以后的数据制成签名,使得 Alice 的对比没法发现不一致;可是一旦解开签名,就不可能再从新生成 Bob 的签名了,由于没有 Bob 的私钥。
综上,数字签名能够必定程度上认证数据的来源。之因此说是必定程度上,是由于这种方式依然可能受到中间人***。一旦涉及公钥的发布,接收方就可能收到中间人的假公钥,进行错误的认证,这个问题始终避免不了。
说来好笑,数字签名就是验证对方身份的一种方式,可是前提是对方的身份必须是真的… 这彷佛陷入一个先有鸡仍是先有蛋的死循环,要想肯定对方的身份,必须有一个信任的源头,不然的话,再多的流程也只是在转移问题,而不是真正解决问题。
证书其实就是公钥 + 签名,由第三方认证机构颁发。引入可信任的第三方,是终结信任循环的一种可行方案。
证书认证的流程大体以下:
一、Bob 去可信任的认证机构证明本人真实身份,并提供本身的公钥。
二、Alice 想跟 Bob 通讯,首先向认证机构请求 Bob 的公钥,认证机构会把一张证书(Bob 的公钥以及本身对其公钥的签名)发送给 Alice。
三、Alice 检查签名,肯定该公钥确实由这家认证机构发送,中途未被篡改。
四、Alice 经过这个公钥加密数据,开始和 Bob 通讯。
PS:以上只是为了说明,证书只须要安装一次,并不须要每次都向认证机构请求;通常是服务器直接给客户端发送证书,而不是认证机构。
也许有人问,Alice 要想经过数字签名肯定证书的有效性,前提是要有该机构的(认证)公钥,这不是又回到刚才的死循环了吗?
咱们安装的正规浏览器中都预存了正规认证机构的证书(包含其公钥),用于确认机构身份,因此说证书的认证是可信的。
Bob 向机构提供公钥的过程当中,须要提供不少我的信息进行身份验证,比较严格,因此说也算是可靠的。
得到了 Bob 的可信公钥,Alice 和 Bob 之间的通讯基于加密算法的保护,是彻底无懈可击的。
如今的正规网站,大都使用 HTTPS 协议,就是在 HTTP 协议和 TCP 协议之间加了一个 SSL/TLS 安全层。在你的浏览器和网站服务器完成 TCP 握手后,SSL 协议层也会进行 SSL 握手交换安全参数,其中就包含该网站的证书,以便浏览器验证站点身份。SSL 安全层验证完成以后,上层的 HTTP 协议内容都会被加密,保证数据的安全传输。
这样一来,传统的中间人***就几乎没有了生存空间,***手段只能由技术缺陷转变为坑蒙拐骗。事实上,这种手段的效果反而更高效,好比我就发现网上很多下载网站发布的浏览器,不只包含乱七八糟的导航和收藏网址,还包含一些不正规的认证机构证书。任何人均可以申请证书,这些不正规证书极可能形成安全隐患。
对称性加密算法使用同一个密钥加密和解密,难以破解,加密速度较快,可是存在密钥配送问题。
Diffie-Hellman 密钥交换算法可让双方「心有灵犀一点通」,必定程度解决密钥配送问题,可是没法验证通讯方的身份,因此可能受到中间人***。
非对称性加密算法生成一对儿密钥,把加密和解密的工做分开了。
RSA 算法做为经典的非对称加密算法,有两种用途:若是用于加密,能够把公钥发布出去用于加密,只有本身的私钥能够解密,保证了数据的机密性;若是用于数字签名,把公钥发布出去后,用私钥加密数据做为签名,以证实该数据由私钥持有者所发送。可是不管那种用法,涉及公钥的发布,都没法避免中间人***。
公钥证书就是公钥 + 签名,由可信任的第三方认证机构颁发。因为正规浏览器都预装了可信的认证机构的公钥,因此能够有效防止中间人***。
HTTPS 协议中的 SSL/TLS 安全层会组合使用以上几种加密方式,因此说不要安装非正规的浏览器,不要乱安装未知来源的证书。
密码技术只是安全的一小部分,即使是经过正规机构认证的 HTTPS 站点,也不意味着可信任,只能说明其数据传输是安全的。技术永远不可能真正保护你,最重要的仍是得提升我的的安全防范意识,多留心眼儿,谨慎处理敏感数据。
_____________