前言
话说前段时间,大毛和二毛两家打的那叫一个热火朝天。大毛将二毛摁在地上反复摩擦之际,鹰酱给二毛发去一项指令:不要送!!!而此条指令被精通特工技术的大毛潜伏人员截获对报文内容进行稍加修饰:不要怂!!!二毛收到指令瞬间就打上鸡血,哐哐就是和大毛死磕到底。二毛:鹰酱都这么说了,肯定能给我不少支持,我可得卖力好好表现一番。然后在鹰酱的一声声猪队友的骂声中,二毛又被摁在地上反复摩擦。由此可见通信安全的重要性。(故事纯属娱乐虚构,切不可当真)
接下来就和大家一起探讨一下如何设计一个安全可靠的加密通讯挽救二毛危在旦夕的性命吧。
正文
相信说到通信安全大家脑海里就会浮现一下几个名词:可逆加密、不可逆加密、对称加密、非对称加密、公钥、私钥、加签、解签、数字签名、数字证书...等等。现在就先回顾一下这些名词都指代什么含义吧。
加密算法的分类
加密算法大类主要可分为:可逆加密和不可逆加密
可逆加密
也称为对称和非对称加密算法的组合,即通过密钥可将密文还原成明文的加密算法
对称加密
指通过一个密钥即可完成报文的加解密的过程。
对称加密算法常用的有:
-
高级加密标准(AES, Advanced Encryption Standard):
- 简介:AES 是目前最常用的对称加密算法,由美国国家标准与技术研究院(NIST)在2001年发布。
- 密钥长度:支持128位、192位和256位密钥。
- 优点:安全性高、性能好,广泛用于各种应用场景,包括数据传输和存储。
-
数据加密标准(DES, Data Encryption Standard):
- 简介:DES 是一种旧的对称加密算法,由IBM在1970年代开发,曾被广泛使用。
- 密钥长度:56位密钥。
- 缺点:由于密钥长度过短,已经被认为不再安全。
-
三重数据加密标准(3DES, Triple DES):
- 简介:为增强DES的安全性,3DES使用三个不同的DES密钥进行三次加密。
- 密钥长度:实际密钥长度为112位或168位。
- 优点:比单一的DES安全性更高,但计算性能较差。
-
国际数据加密算法(IDEA, International Data Encryption Algorithm):
- 简介:由瑞士学者在1991年开发的对称加密算法,常用于PGP(Pretty Good Privacy)等应用中。
- 密钥长度:128位密钥。
- 优点:安全性好,且没有已知的有效攻击方法。
-
Blowfish:
- 简介:由Bruce Schneier在1993年设计的一种对称加密算法,设计初衷是作为DES的替代品。
- 密钥长度:可变密钥长度,从32位到448位。
- 优点:灵活性高,性能优异,适用于各种应用。
-
Twofish:
- 简介:Blowfish的后续算法,也是由Bruce Schneier开发,用于AES竞赛的一个候选算法。
- 密钥长度:128位、192位或256位密钥。
- 优点:安全性强,速度快,结构复杂,使其难以被破解。
-
RC4(Rivest Cipher 4):
- 简介:由Ron Rivest设计的流加密算法。
- 密钥长度:1到256字节(8到2048位)。
- 缺点:由于多种已知漏洞,现在被认为不再安全,逐渐被弃用。
加解密流程如下:
非对称加密
非对称加密是指加密和解密使用不同的密钥,分为公密和私钥。本着私钥不外泄的原则,无论是用于加解签还是数据的加解密私钥都是自身保留,讲公钥给对方。
常见的非对称加密算法有:
-
RSA(Rivest-Shamir-Adleman):
- 简介:由Ron Rivest、Adi Shamir和Leonard Adleman在1977年开发,是最著名和最广泛使用的非对称加密算法之一。
- 密钥长度:通常为1024位、2048位或更高。
- 优点:安全性高,广泛用于数字签名和密钥交换。
-
DSA(Digital Signature Algorithm):
- 简介:数字签名算法,是由美国国家标准与技术研究院(NIST)在1991年提出的一种用于数字签名的算法。
- 密钥长度:通常为1024位、2048位或更高。
- 优点:专门用于数字签名,较为高效。
-
ECC(Elliptic Curve Cryptography):
- 简介:椭圆曲线密码学,基于椭圆曲线数学构造的一类加密算法,具有高效和高安全性的特点。
- 密钥长度:256位、384位、521位等(相对于RSA,ECC可以在较短密钥长度下提供相当的安全性)。
- 优点:性能优异,适用于移动设备等计算资源有限的环境。
-
ElGamal:
- 简介:由Taher ElGamal在1985年提出的基于离散对数问题的加密算法。
- 密钥长度:通常为1024位或2048位。
- 优点:用于加密和数字签名,但比RSA更慢。
-
Diffie-Hellman:
- 简介:由Whitfield Diffie和Martin Hellman在1976年提出的一种密钥交换协议,不用于直接加密数据,但用于安全地交换加密密钥。
- 密钥长度:通常为1024位或2048位。
- 优点:广泛用于安全协议(如TLS)中以建立共享密钥。
-
EdDSA(Edwards-curve Digital Signature Algorithm):
- 简介:基于椭圆曲线Edwards形式的一种数字签名算法,具有高效和高安全性的特点。
- 密钥长度:常见的有Ed25519(基于Curve25519曲线,提供128位安全性)。
- 优点:签名速度快,安全性高。
加解密流程如下:
不可逆加密
不可逆加密算法,通常指哈希函数或消息摘要算法,这些算法将输入数据转换为固定长度的哈希值(散列值),并且这种转换是单向的,不可逆的。以下是一些常见的不可逆加密算法:
-
MD5(Message Digest Algorithm 5):
- 摘要长度:128位(16字节)。
- 特点:速度快,但由于存在广泛的碰撞漏洞,已经不再推荐用于安全敏感的应用。
-
SHA-1(Secure Hash Algorithm 1):
- 摘要长度:160位(20字节)。
- 特点:相较于MD5更安全,但仍然存在碰撞攻击风险,已经不再推荐用于安全应用。
-
SHA-2(Secure Hash Algorithm 2):
- 摘要长度:包括SHA-224、SHA-256、SHA-384和SHA-512等。
- 特点:目前被广泛推荐和使用,具有较高的安全性。
-
SHA-3(Secure Hash Algorithm 3):
- 摘要长度:224位、256位、384位和512位。
- 特点:基于Keccak算法,提供与SHA-2类似的安全性,但采用不同的结构以增强抗攻击能力。
-
RIPEMD-160:
- 摘要长度:160位(20字节)。
- 特点:相较于SHA-1具有类似的安全性,但不如SHA-2广泛使用。
-
BLAKE2:
- 摘要长度:BLAKE2b(512位)、BLAKE2s(256位)。
- 特点:高效、灵活且安全,被认为是SHA-3的一个强有力的替代方案。
报文安全之路
有了上面基础,就可以开始着手研究如何对报文传输进行。
Round1
由于先前鹰酱和二毛的对话通过明文传输,被大毛截获了鹰酱的报文,通过篡改然后再发给二毛,导致二毛接收到了错误的指令。如图所示
由上图可知,明文的报文极容易被截获,然后篡改,二毛对报文的真实度完全未知。那么我们可以试着从上面介绍的加密算法中选取合适的对报文进行加密不就可以了。首先报文的要求需要讲密文传输的信息再还原成明文二毛方可理解,排除不可逆加密算法。
那么尝试使用对称加密算法试试看呢?
Round2
假设就使用AES加密算法进行传输,双方约定好公用的密钥进行交互。假使双方密钥都能保证一定不外泄,看起来交互是安全的,报文内容由于是密文就算被截获了大毛也看不懂内容是啥。但是天下哪有不透风的墙,在网络环境中不应该抱着如此侥幸的心理寄希望于发出去的密钥能不被告知。而且,假使密钥被泄露了,在分锅的时候是该怪鹰酱泄露了密钥还是二毛泄露了密钥呢?
综上,对称加密虽然在一定程度上算是安全的,但是对于报文的密钥如果外泄那将是灾难性的。这种方式虽然是可以的,但是还是不够保险。
Round3
那如果尝试采用非对称加密算法呢?该方式由二毛去生成公私钥,然后讲公钥给到鹰酱。即使公钥被大毛截获了,也无法解开密文。无法任意篡改发送的报文内容。
那细想一下如果公钥被截获了会出现什么情况呢?
是的,如上虽然大毛无法得知鹰酱发出的是什么指令,但是大毛用截获的公钥可以任意对报文进行加密然后发送给二毛。而此时二毛依旧傻傻分不清哪条指令是鹰酱的正确指令。而且如果二毛给到鹰酱的公钥被大毛进行了中间人攻击,然后生成一段自己的公钥再发给鹰酱,就变成了鹰酱加密的密文大毛可以解密出然后获悉鹰酱的真实目的,然后大毛还能给二毛发送错误的指令迷惑二毛。
总结来说,该种方式无法对客户端的身份进行验证,而且由于公钥放在外网可能被获悉,进行中间人攻击等等各种不安全因素。
Round4
那么是不是可以引入一个中间人,将服务端的公钥与服务端的一些必要信息进行报备,由中间人对公钥进行安全的签名。双方对该一机构的公信都认可,保证公钥不被篡改。
因此引入数字证书,数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。因此数字证书又称为数字标识。数字证书对网络用户在交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
通俗的讲就是现在不是直接将公钥给到客户端,而且将相关信息(公钥、域名、组织名称、单位名称、城市...)提供给一个成为CA机构(Certificate Authority, CA)
1、由CA对公钥进行数字签名,一般是使用机构的私钥对你的公钥进行加签生成签名密文。此时会给到你证书文件,进行请求时讲证书链发给服务端。
2、当客户端收到服务器证书链时,会验证证书链中的每个证书,直到找到信任库中的根证书。如果证书链中的每个证书都有效,且根证书在信任库中,则连接被认为是安全的。
3、然后将证书中的签名密文使用对应CA机构的公钥进行解密就能获得服务端提供的公钥即可对请求进行加密了。依赖于次安全传递公钥,防止被篡改
即鹰酱给二毛发消息的时候,使用上Https安全协议就能安全愉快的沟通了。再也不用担心消息被截获篡改了。但是!!!公钥是安全了。也架不住大毛也给二毛发消息轰炸不是,这就是另外一层身份认证的工作了。
1、鹰酱侧可以再生成一对公私钥,这对公私钥是进行加签解的,大体交互流程是鹰酱使用二毛的公钥对报文进行一次加密,然后在使用鹰酱私钥进行加签(加签算法一般采用不可逆加密)。二毛侧则先使用鹰酱的公钥进行验签,验证通过则标识请求是鹰酱请求可以放心解密,在使用二毛自身的私钥对密文进行解密即可
2、同时为了防止大毛对二毛进行信息轰炸,二毛侧也可对请求进行IP百名单限制
结语
上面依据一个小故事和大家共同探讨了下接口安全问题简单的一个设计流程,对笔者也是一次知识的巩固,希望能帮助到大家
标题:一文讲清加解签名、加解密、数字签名、数字证书
作者:JonLv
地址:http://39.108.183.139:8080/articles/2024/05/22/1716376548203.html