安全算法
5-1 安全和算法
- 传输数据时的四个问题:
- 窃听:A向B发送的消息可能会在传输途中被X偷看;
- 假冒:A以为向B发送了消息,然而B有可能是X冒充的;
- 篡改:B确实收到了A发送的消息,该消息的内容在途中就被X更改了;
- 事后否认:B从A那里收到了消息,但作为消息发送者的A可能对B抱有恶意,并在事后声称“这不是我发送的消息”;
- 解决这些问题的安全技术
- “窃听”,我们会使用 加密”技术。
- 假冒”,我们会使用消息认证码或数字签名技术。
- 篡改”,我们同样会使用消息认证码或数字签名技术。
- “事后否认”,我们同样会数字签名技术。
5-2 加密的基础知识
首先,计算机会用由0和1这两个数字表示的二进制来管理所有数据。
对计算机来说,数据就是一串有意义的数字罗列。
密文也是数字罗列,只不过它是计算机无法理解的无规律的数字罗列。
加密
: 就是数据经过某种运算后,变成计算机无法理解的数的过程(请参考下图)
在加密运算上会用到“密钥”。所以加密就是用密钥对数据进行数值运算,把数据变成第三者无法理解的形式的过程(请参考下图)。
反过来,解密就是像下图这样,通过密钥进行数值计算,把密文恢复成原本数据的过程。
像这样,将数据变成第三者的计算机无法理解的形式,然后再将其恢复成原本数据
的一系列操作就是加密技术
。
5-3 哈希函数
哈希函数 可以把给定的数据转换成固定长度的无规律数值。转换后的无规律数值可以作为数据摘要应用于各种各样的场景。
输出的无规律数值就是“哈希值”。哈希值虽然是数字,但多用十六进制来表示。
- 哈希函数的特征:
- 输出的哈希值数据长度不变。不管输入的数据多小/大,哈希值的长度仍然相同。
- 如果输入的数据相同,那么输出的哈希值也必定相同。
- 即使输入的数据相似,输出的哈希值也会有很大的差异。输入相似的数据并不会导致输出的哈希值也相似。
- 即使输入的两个数据完全不同,输出的哈希值也有可能是相同的,虽然出现这种情况的概率比较低。这种情况叫作“哈希冲突”。
- 不可能从哈希值反向推算出原本的数据。输入和输出不可逆这一点和加密有很大不同。
- 求哈希值的计算相对容易。
- 说明:
哈希函数的算法中具有代表性的是MD5、SHA-1和SHA-2等。
其中SHA-2是现在应用较为广泛的一个,
而MD5和SHA-1存在安全隐患,不推荐使用。
将用户输入的密码保存到服务器时也需要用到哈希函数。
5-4 共享密钥加密
加密数据的方法可以分为两种:
- 加密和解密都使用相同密钥的“共享密钥加密”;
- 分别使用不同密钥的“公开密钥加密”。
共享密钥加密是加密和解密都使用相同密钥的一种加密方式。由于使用的密钥相同,所以这种算法也被称为对称加密
。
共享密钥有被第三者窃听的风险,可以使用“密钥交换协议”和“公开密钥加密”两种方法。
5-5 公开密钥加密
公开密钥加密是加密和解密使用不同密钥的一种加密方法。由于使用的密钥不同,所以这种算法也被称为“非对称加密”。
- 加密用的密钥叫作“公开密钥”,
- 解密用的叫作“私有密钥”。
实现公开密钥加密的算法有RAS算法、椭圆曲线加密算法等,其中使用最为广泛的是RSA算法。
RSA算法由其开发者Rivest、Shamir、Adleman的首字母命名而来,三人在2002年获得了图灵奖。
- 公开密钥加密的问题:
- 公开密钥加密容易被窃听。可用数字证书解决。
- 加密和解密都比较耗时,所以这种方法不适用于持续发送零碎数据的情况。用到“混合加密”解决。
考虑到加密所需的计算流程,算法必须满足如下条件。
① 可以使用某个数值对数据进行加密(计算)。
② 使用另一个数值对加密数据进行计算就可以让数据恢复原样。
③ 无法从一种密钥推算出另一种密钥。
稍微思考一下便知道,想要找到满足以上条件的算法难度有多大。所以,RSA等可以实现公开密钥加密的算法的提出,对当今互联网社会的安全有着重要的意义。
5-6 混合加密
共享密钥加密存在无法安全传输密钥的密钥分配问题,公开密钥加密又存在加密解密速度较慢的问题。结合这两种方法以实现互补的一种加密方法就是混合加密。
接下来,A只要将使用这个密钥加密好的数据发送给B即可。加密数据时使用的是处理速度较快的共享密钥加密。
像这样,混合加密在安全性和处理速度上都有优势。能够为网络提供通信安全的SSL协议也应用了混合加密方法。
SSL是Secure Sockets Layer(安全套接层)的简写,该协议经过版本升级后,现在已正式命名为TLS(TransportLayer Security,传输层安全)。但是,SSL这个名字在人们心中已经根深蒂固,因此该协议现在也常被称为SSL协议或者SSL / TLS协议。
5-7 迪菲-赫尔曼密钥交换
迪菲-赫尔曼(Diffie-Hellman)密钥交换是一种可以在通信双方之间安全交换密钥的方法。
这种方法通过将双方共有的秘密数值隐藏在公开数值相关的运算中,来实现双方之间密钥的安全交换。
- 算法概念
假设有一种方法可以合成两个密钥。使用这种方法来合成密钥P和密钥S,就会得到由这两个密钥的成分所构成的密钥P-S。 - 合成方法有三个特征:
+ 第一,即使持有密钥P和合成的密钥P-S,也无法把密钥S单独取出来。
+ 第二,不管是怎样合成而来的密钥,都可以把它作为新的元素,继续与别的密钥进行合成。
+ 第三,密钥的合成结果与合成顺序无关,只与用了哪些密钥有关。
- 说明
使用迪菲-赫尔曼密钥交换,通信双方仅通过交换一些公开信息就可以实现密钥交换。但实际上,双方并没有交换密钥,而是生成了密钥。因此,该方法又被叫作“迪菲-赫尔曼密钥协议”。
参考链接:Diffie-Hellman(迪菲-赫尔曼)秘钥交换
5-8 消息认证码
消息认证码可以实现“认证”和“检测篡改”这两个功能。
- 消息认证码就是可以预防 密文的内容在传输过程中可能会被篡改,这会导致解密后的内容发生变化,从而产生误会。
- 消息认证码,简称为MAC(Message Authentication Code)由密钥和密文生成的。
- 我们可以把MAC想象成是由密钥和密文组成的字符串的“哈希值”。计算MAC的算法有HMAC、OMAC、CMAC等。目前,HMAC的应用最为广泛。
- 使用MAC时,生成的一方和检测的一方持有同样的密钥,所以不能确定MAC由哪方生成。这个问题可以用下一节将会讲到的“数字签名”来解决。
参考链接:消息认证码
5-9 数字签名
数字签名不仅可以实现消息认证码的认证和检测篡改功能,还可以预防事后否认问题的发生。
- 数字签名和消息认证码区别:
由于在消息认证码中使用的是共享密钥加密,所以持有密钥的收信人也有可能是消息的发送者,这样是无法预防事后否认行为的。
而数字签名是只有发信人才能生成的,因此使用它就可以确定谁是消息的发送者了。 - 数字签名三个功能:认证,检测篡改,预防事后否认。
- 数字签名缺陷:冒充风险。=>“数字证书”就能解决
参考链接:通俗理解数字签名,数字证书和https
5-10 数字证书
“公开密钥加密”和“数字签名”无法保证公开密钥确实来自信息的发送者。
- 数字证书 能保证公开密钥的正确性。
- 通过数字证书,信息的接收者可以确认公开密钥的制作者。
- 认证中心是管理数字证书的组织机构。原则上谁都可以成为认证中心,所以认证中心的数量也比较多,但建议在经过政府审查的大型企业机构进行申请,这些机构更令人放心。
- 数字证书通过认证中心来担保公开密钥的制作者。这一系列技术规范被统称为“公钥基础设施”(Public Key Infrastructure, PKI)。