概念解释:对称加密、⾮对称加密、公钥、私钥、签名、证书
楔⼦
现在⽹络的安全性已经变得越来越重要,各位程序员在开发过程中或多或少都会遇到公钥、私钥、加密、签名等⼀些相关名词。这些概念⽐较杂乱,容易混淆,下⾯就来梳理⼀下这部分的内容。
对称加密
在重要的信息的传递过程中,⼈们总是希望信息不会被偷看、不会被篡改,伪造等。为了达到这个要求⼈们⼀直在不断努⼒着。
电报加密使⽤的密码本,就是初代⽹络安全所使⽤的加密⽅式,⽤法为:发信时将内容翻译为密⽂发出,收到电报的⼀⽅,使⽤相同的密码本才能解密出正确的信息,否则看到的就是⼀堆乱码。
这种传统的加密⽅式就叫做对称加密。
⽽对称加密所使⽤的算法包括:DES、3DES、AES、DESX、Blowfish、RC4、RC5、RC6,这些算法就可以看成密钥、或者理解为上⾯的密码本。这些算法也可以称为: "对称加密算法"或者"传统加密算法",⼀⽅使⽤算法进⾏加密,然后另⼀⽅使⽤相同的算法进⾏解密。
我们以《福尔摩斯探案集之跳舞的⼩⼈》⼀案中出现的⼩⼈为例
我们看到每⼀个⼩⼈都代表⼀个英⽂字符,⾄于⼩⼈⼿中的旗⼦则是⽤来分隔单词的、也就是表⽰⼀个单词的边界。传递信息的时候,将信息⽤⼩⼈来代替,然后另⼀⽅看到⼩⼈的时候,再将出现的⼩⼈解析成信息。顺便⼀提,剧中的⼥主是⿊帮⾸领的⼥⼉,犯⼈就是使⽤这些⼩⼈来向⼥主传递信息,威胁她回去。
这些⼩⼈和英⽂字符之间的对应关系就相当于密钥,此时就相当于⼀个对称加密。因为⽆论是发信⼈还是收信⼈,使⽤的是相同的密钥、即:⼩⼈代表的含义都是⼀样的。
但是对称算法的安全性⾮常依赖于密钥,泄漏密钥就意味着任何⼈都可以对他们发送或接收的消息解密,所以密钥的保密性对通信安全⾄关重要。所以福尔摩斯在解析出这些⼩⼈代表的含义之后,⽤这些⼩⼈发送信息将犯⼈引诱了出来。因此对于这种对称加密来说,密钥的安全是极其重要的。
那么对称加密有哪些优缺点呢?
优点:计算量⼩、加密速度快、加密效率⾼
缺点:1.密钥需要传递,难以确保密钥安全性。2.缺乏签名功能,即不能核对发信⼈⾝份
⾮对称加密
在对称加密中,密钥(也就是使⽤的加密算法,如上⽂中发电报时的密码本、⼩⼈和英⽂字符的对应关系)的保密性⾄关重要。战争时期,电报密码本需要通过⼈⼯渠道传递,这样发报双⽅才能放⼼的使⽤。
但如今的⽹络通信中,显然不可能再使⽤⼈⼯渠道传递密钥,只有通过⽹络来传递才⾼效快捷。这样就有了⼀个⽭盾:密钥是⽤来保证⽹络传输安全的,这个对于⽹络安全⾄关重要的密钥⼜需要⽹络来传递给对⽅。
保存密钥最安全的⽅式就是不告诉任何⼈,不进⾏传递,但对称加密中,解密⽅必须要得到对应的密钥,这就⼜要求密钥必须进⾏传递,可⼀旦传递密钥就有丢失的风险。这个"鸡⽣蛋、蛋⽣鸡"的问题⼀直困扰着⼈们。直⾄出现了⼀种算法:这套算法⽣成的密钥分为两个部分:公钥、私钥。
这个⼀分为⼆的密钥对有如下特点:
公钥和私钥是⼀个算法中两个不同、但内在⼜相关联的参数集合,同时⽣成,但可以独⽴使⽤。
公钥加密的数据只有对应的私钥才可以解密(公钥加密后公钥也不能解密)
私钥加密的数据也只有对应的公钥才可以解密。
常见的⾮对称加密算法:RSA、DSA、ECC、Diffie-Hellman、El Gamal 等。
RSA 算法概述
对称加密的模式我们很好理解,但⾮对称加密算法的上述特点让我们感觉很神奇,下⾯让我们先来简单看看,上述这些特点在数学上是怎样实现的吧。在⾮对称加密算法中 RSA 是使⽤最⼴泛的⼀种,下⾯我们介绍⼀下 RSA。
RSA 算法是 1977 年由共同在⿇省理⼯学院⼯作⼯作的罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)⼀起提出的。RSA 就是他们三⼈姓⽒开头字母拼在⼀起组成的。
RSA 加密利⽤了"单向函数"正向求解很简单,反向求解很复杂的特性。思想如下:
对两个质数相乘容易,⽽将其合数分解很难的这个特点进⾏的加密算法。 n=p1*p2,已知 p1、p2 求 n 简单,已知 n 求p1、p2 困难。
(m^e)%n=c,已知 m、e、n 求 c 简单,已知 e、n、c 求 m 很难。
RSA 算法的安全性基于 RSA 问题的困难性,也就是基于⼤整数因⼦分解的困难性上。这种算法⾮常可靠,密钥越长,它就越难破解。根据已经披露的⽂献,⽬前被破解的最长 RSA 密钥是 768 个⼆进制位。也就是说,长度超过 768 位的密钥,还⽆法破解(⾄少没⼈公开宣布)。因此可以认为,1024 位
的 RSA 密钥基本安全,2048 位的密钥极其安全
⾮对称加密的算法⽐对称加密要复杂且耗时,位数越多越耗时。因此在实际使⽤中,⼀般是先⽤⾮对称加密过程传递对称加密的密钥,之后再使⽤对称加密来保证后续的通信,这样安全性与速度就可以达到了⼀个平衡,HTTPS 所使⽤的就是这种⽅式,后⽂会介绍。
使⽤⾮对称加密进⾏通信
有了⾮对称加密的「公私钥对」,这样通信中仅需传递公钥,甚⾄公钥可以开放给所有⼈。需要发消息给我的⼈使⽤我的公钥加密后发给我,只有我可以使⽤私钥解密,其他⼈不可能获知信息的内容。
但这只是单⽅向的加密,双向加密怎么办呢?对⽅也创建⼀个公私钥对就可以了。
A 根据⾮对称加密算法⽣成⾃⼰的公私钥对(PUBLIC_A,PRIVATE_A);
B 也根据⾮对称加密算法⽣成⾃⼰的公私钥对(PUBLIC_B,PRIVATE_B);
A 和
B 可以公开的交换⾃⼰的公钥(私钥不需要发送,各⾃保存好即可);
A 使⽤
B 的公钥 PUBLIC_B 加密信息,发送给 B;
B 接收到消息后,使⽤⾃⼰保存的私钥 PRIVATE_B 解密就可以看到消息内容(这条消息即使被他⼈获得后也是不能解密
的);
同样,B 要发消息给 A 时,使⽤ A 的公钥 PUBLIC_A 加密发出;
A 收到消息后使⽤⾃⼰的私钥 PRIVATE_A 解密,这样就实现了双⽅加密的通信。
签名
上⾯我们看到,有了公私钥对,似乎解决了加密通信的难题。但是实际使⽤中⼜出问题了,那就是 A 收到消息后如何确认发信⼈是 B ⽽不是第三⽅呢?其实也很简单,只要发消息前多进⾏⼀次使⽤⾃⼰的私钥加密的过程就可以了,这次「使⽤⾃⼰私钥加密信息的步骤就叫做签名」
签名字符串是什么私钥只有⾃⼰持有,公钥和私钥存在⼀⼀对应关系,「即使⽤公钥只能解密出对应私钥加密的信息」,
因此就可以⽤私钥的加密过程当做验证⾝份的⼿段了。其实公钥、私钥加密数据的⽅法与原理都相同,「只是按照⽤途分别命名了⽽已」公钥⼀般⽤来加密,私钥⽤来签名。
还使⽤上边的例⼦来看⼀下,使⽤了加密和签名之后的通信过程:
A 先使⽤⾃⼰的私钥 PRIVATE_A 对消息进⾏⼀遍加密(习惯性称作签名),再使⽤
B 的公钥 PUBLIC_B 加密信息,然后
将加密结果发送给 B。
B 接收到消息后,使⽤⾃⼰保存的私钥 PRIVATE_B 解密,然后使⽤ A 的公钥 PUBLIC_A 再解密⼀遍,如果能解密成功,
就可以确保这条消息不是伪造的。
同样,B 要发消息给 A 时先使⽤⾃⼰的私钥 PRIVATE_B 对消息进⾏⼀遍加密(习惯性称作签名),再使⽤ A 的公钥
PUBLIC_A 加密后发出。
A 收到消息后使⽤⾃⼰的私钥 PRIVATE_A 解密,然后使⽤
B 的公钥 PUBLIC_B 再解密⼀遍,这样就实现了双⽅互相确认
⾝份的加密通信。
由于⾮对称加密是复杂且耗时的,⽽且需要加密的内容越长就越耗时。在实际使⽤中⼀般经过摘要算法得到⼀串哈希值,然后使⽤私钥对哈希值进⾏加密。习惯性将这样对摘要使⽤私钥加密⽣成的⽂件叫做签名⽂件。
哈希值算法
⽣成摘要的哈希算法有如下特点:
可以将任意长度的信息与⼀串固定长度的字符串建⽴对应关系,即哈希值定长
哈希值算法将任意长度映射为有限长度,难免有碰撞(即,两个不同信息算出的摘要相同)。好的哈希值算法就是能够尽量减少碰撞的⼏率
原始信息的任何⼀点修改都会导致计算出的哈希值的变化,从⽽可以⽤哈希值来确保消息体的完整性
哈希值算法是单向的,即只能从原信息计算出哈希值,不能由哈希值回算得到原信息
但是有的⼈可能见过⽹上有破解哈希加密的,其实它并不是反向推理,⽽是使⽤"撞库"的⽅式。意思就是事先对⼤量不同的字符串进⾏哈希加密,然后再将原来的字符串和⽣成的哈希值保存起来。然后根据⽤户输⼊的哈希值来进⾏检索,这就是"撞库"。不过这⼀般都是⽐较简单的哈希加密(md5),⽽且没有加盐。
常见算法有 MD5、SHA1、SHA256、SHA512 等。
⼤部分⽹站对⽤户密码保护也是利⽤哈希值单向性这个特点。数据库只保存⽤户密码的哈希值,进⾏登录操作时,将此次输⼊的密码再次计算哈希值与数据库保存的哈希值对⽐,对⽐通过则认为密码正确。这样即使数据库泄露,⿊客也⽆法获知⽤户的密码。
这样就演化出了⽬前实际使⽤的签名、加密过程:
A 先使⽤哈希算法将要发送的消息计算出摘要,再⾃⼰的私钥 PRIVATE_A 对摘要进⾏签名得到签名⽂件,然后将原始消息
和签名⽂件打包到⼀起,使⽤ B 的公钥 PUBLIC_B 加密信息,发送给 B。
B 接收到消息后,使⽤⾃⼰保存的私钥 PRIVATE_B 解密,得到原始消息和⼀个签名⽂件。使⽤哈希算法对原始消息计算得
到⼀个哈希值,再使⽤ A 的公钥 PUBLIC_A 对签名⽂件进⾏解密,得到消息的哈希值,将这两个哈希值进⾏对⽐,如果⼀致就可以认为这条消息是 A 发送的且未经过篡改。
公钥与证书
从上边的流程来看,似乎⼀切都完美了,但⿊客也是绞尽脑汁的,他们还是从中到了破绽。那就是我们对 A 的⾝份识别是建⽴在相信 PUBLIC_A 的公钥确实是 A 的,然⽽⿊客可以轻易的发布⾃⼰的公钥宣称这是 A 的公钥来欺骗我们,那我们⼜怎么样区分呢?这就需要⼀个机构来保证了,这个机构把 A 提供的公钥和 A 的相关信息放在⼀起组合成⼀份证书,这样你从这个机构获取证书,就可以得到有权威机构背书的公钥与 A 的对应关系。
这个机构叫做 CA,发布的证书叫做 CA 证书。
证书授权中⼼ CA
CA 证书授权(CertificateAuthority)中⼼是数字证书发⾏的唯⼀机构。
CA 中⼼⼜称 CA 机构,即证书授权中⼼(Certificate Authority),或称证书授权机构,作为电⼦商务交易中受信任的第三⽅,承担公钥体系中公钥的合法性检验的责任。CA 中⼼为每个使⽤公开密钥的⽤户发放⼀个数字证书,数字证书的作⽤是证明证书中列出的⽤户合法拥有证书中列出的公开密钥。CA 机构的数字签名使得攻击者不能伪造和篡改证书。在 SET 交易中,CA 不仅对持卡⼈、商户发放证书,还要对获款的银⾏、⽹关发放证书。它负责产⽣、分配并管理所有参与⽹上交易的个体所需的数字证书,因此是安全电⼦交易的核⼼环节。
CA 证书是逐级保证安全的,最终的根证书内置在操作系统中。由操作系统来保证,这部分下⽂中会进⾏介绍。
CA证书链如下图:
HTTPS 的安全传输过程
HTTPS 中的 S,就是 Secure(安全)的意思,这就是⽐ HTTP 多出的⼀份安全保证,浏览器验证了⽹站的证书后会在地址栏的左边显⽰绿⾊的锁的标志,标志该⽹站是安全可信任的官⽹。
由于⾮对称加密是耗时的,如果在每⼀次 HTTPS 的数据传输中都使⽤⾮对称加密是不合适的。实际上的做法是在第⼀次建⽴ HTTPS 连接时使⽤⼀次⾮对称加密传递对称加密的密钥,然后就使⽤对称加密来保证接下来的通信过程。
HTTPS 的通信过程如下:
浏览器发出 HTTPS 请求。
服务器返回本⽹站的证书。
浏览器基于内置在操作系统中的CA证书链对⽹站证书的有效性进⾏校验。校验通过后使⽤证书中的公钥加密⼀份对称加密的密钥信息,发送给服务端。
服务端收到信息后使⽤⾃⼰的私钥解密信息,得到浏览器提供的⽤于对称加密的密钥信息。之后的通信过程就使⽤这个对称加密的密钥来保护。
Android 的安全启动过程(SecureBoot)
上⼀⼩节可以看到 HTTPS 的证书有效性还是要基于内置在操作系统中的「CA 根证书的」
那操作系统⼜是如何保证系统⾃⾝以及系统内包含的「CA 根证书」不被篡改的呢?我们以 Android 来举例,因为相较于PC ⽽⾔,⼿机⼚商的安全性⽬前做的更好。
⼿机⼚商建⽴了⼿机内部处理器与⼿机操作系统的绑定关系(也就是说开启 SecureBoot 功能的⼿机是
「不能刷⾮官⽅系统」的),⼀旦刷⼊第三⽅系统后,⼿机则会不开机。这也是利⽤上⽂提到的公钥、私钥实现的,来具体看⼀下:⼿机的处理器内部存在⼀块只能写⼀次数据的 OTP 区域,出⼚时会将⼚商的公钥写⼊。物理上就保证了这部分不可更改。
⼿机操作系统固件会使⽤⼚商的私钥进⾏加密。
⼿机处理器的第⼀部分启动程序(这部分程序也是固化在处理器内部的不可更改)会使⽤ OTP 中的公钥对操作系统进⾏解密,解密成功才可以启动,否则⽴马变"砖"。
这个过程就叫做「安全启动」,即 SecureBoot 。实际过程中为了加快校验速度也使⽤了哈希值算法,但此处仅⽤于说明加密启动的过程,忽略了部分细节。
电脑端 Intel 处理器中其实也存在类似的机制,但⼀般情况下 PC 都希望能够灵活的安装系统,因此默认没有开启Intel 芯⽚中的 SecureBoot 功能。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论