前后端数据传输安全

密码学起源

  • 古典密码学
  • 现代密码学
  • 对称加密
  • 非对称加密
  • 数字签名
  • 哈希

密码学起源
在战争中需要传递信息,所以有了密码学。

隐写术:

在奴隶的头皮上刻字,用头发遮挡;在身上隐私部位刻字。

1.png
武侠小说中武功秘籍是空白的,沾水显出字。

古典密码学
移位式加密:密码棒。

加密算法:缠绕木棒后书写
密钥:木棒的尺寸规格

2.png
替换式加密:

字母表、码表
加密:使用码表替换字母表中对应字母
解密:使用字母表中的字母替换码表中对应字母

3.png
现代密码学
随着计算机的发展,数学算法多次计算。不止可以用于文字内容,还可以用于各种二进制数据。按照加解密使用的密钥是否相同,可分为对称加密和非对称加密。

对称加密
使用密钥和加密算法对数据进行转换,得到的无意义数据即为密文,使用同一密钥和解密算法进行逆向转换,得到原数据。

4.png
加密算法:DES、AES。
DES 密钥位数只有 64 位,已经被弃用。主流 AES 128 位。
举个抽象的栗子:

// 原数据是111
// 加密算法是各项加法
// 解密算法是各项减法
// 密钥是4
111 加密: 1+4,1+4,1+4 = 555
对密文555 解密:5-4,5-4,5-4=111

5.png

非对称加密
使用公钥对数据加密得到密文,使用私钥对数据解密得到原数据。

加密算法:RSA、DSA、椭圆曲线等

下图中的加密密钥就是公钥,发送给客户端,让客户端加密数据,解密密钥就是私钥,自己持有,用来解密客户端加密过的数据。

6.png

// 原数据是111
// 加密算法是各项加法
// 加密密钥是4
// 解密密钥是6,去除十进制进位后的十位。
111 加密: 1+4,1+4,1+4 = 555
对密文555 解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111

7.png

对称加密的优缺点
算法简单,速度快,适合加密大数据。

缺点:在不安全的网络中,密钥传输过程容易被截获。

举个栗子:

网络通信是不安全的,小明对小红发消息,使用对称加密,小明把密钥发给小红的过程中,被法外狂徒张三拦截到了公钥,小明对小红说我家密码是 123456,加密后的密文是aoeqpe,张三拦截后使用公钥解密,知道了小明家的密码,小明没有等到小红,等到了张三。。。

8.png
上面可能有疑问,张三也不知道算法,怎么能破解,其实算法最简单最暴力的破解方法就是穷举法,一个一个试,在计算机发达的时代,简单算法容易被破解。

非对称加密的优缺点
缺点:速度较慢
优点:安全
9.gif
上图中,张三拦截到了小明发给小红的公钥,小明给小红发信息我爱你加密后是asbd,张三拦截到,并没有解密密钥,所以不能破解。

上面的例子是单向通信的,要实现双向通信,小明也需要一对密钥,私钥自己保存,公钥发布给小红。这样小红使用小明的公钥也能安全的给小明发信息了。

10.png
非对称一定安全吗?
11.png
上图中,张三拦截到小明的消息并不能解密,但是他用公钥加密了分手吧发给小红,小红收到后伤心欲绝跳楼了。这就是伪造攻击。
数字签名
为了防止伪造,就需要在数据上附带数字签名,保证数据来源的合法性。

公钥能不能解密私钥加密的数据?

12.png
13.png
还记得上面非对称加密的例子吗:

// 原数据是111
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据111 公钥加密: 1+4,1+4,1+4 = 555
密文555 私钥解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111

现在我们使用数字签名的方法重写上面的例子,把加密后的密文当做原数据:

// 原数据是111
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据111 公钥加密: 1+4,1+4,1+4 = 555
密文555 私钥解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111

// 数字签名

// 原数据是555
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据555 私钥加密: 5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111
对密文111 公钥解密:1+4,1+4,1+4 = 555

公钥可以解密私钥加密的数据。

通常我们使用公钥加密,用私钥解密。而在数字签名中,我们使用私钥加密(相当于生成签名),公钥解密(相当于验证签名)。

我们可以直接对消息进行签名(即使用私钥加密,此时加密的目的是为了签名,而不是保密),验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功,证明是对方发来的消息。但通常我们会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得签名(非对称加密)的效率大大提高。注意,计算消息的散列值不是数字签名的必要步骤。

在实际使用中,我们既想加密消息,又想签名,所以要对加密和签名组合使用,比如TLS就组合了加密和签名。

14.png
数字签名的使用
image-20210728172246257
上图的用法是有漏洞的,如果另一个人拦截了发送方的公钥,就能通过数字签名解密出原数据,数据就被窃听了,并且因为通信中含有2份数据,数据包增大。所以在实际操作中会使用 hash 算法,对原数据摘要进行签名,接收方对解密的数据也进行 hash,把摘要信息和解密的签名数据对比,确定是对方发送的原数据。
16.png
现在,通过 hash,数据量很小,并且可以验证数据来源,但是还有一种攻击,就是重放攻击,需要进一步设计才能抵挡。

举个栗子:

小明给银行发送存一千块钱的请求。张三拦截到原数据,张三并不能解开,但是可以一直给银行发。本来小明存一千块,结果银行收到10次,小明存了一万块。这就是重放攻击。为了防止这种攻击,我们要在数据里利用时间戳、唯一序号等计算出一个请求签名。这样就避免重复消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰鬼丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值