Bootstrap

一文读懂数据加密

本文前言

在计算机信息安全领域,之前软件设计师的网络安全部分了解了一点密码学的知识,这里随想记录一下。
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
部分图片引用来源:https://blog.csdn.net/m0_69916115/article/details/126145847
部分参考文章:https://blog.csdn.net/xiaoming100001/article/details/81109617
https://blog.csdn.net/xiaoming100001/article/details/81109617

在这里插入图片描述
加密算法整体可分为:可逆加密不可逆加密,可逆加密又可以分为:对称加密非对称加密

面试官问:MD5是对称加密还是非对称加密?答:都不是,MD5是一种不可逆加密的消息摘要算法(见后文)

一、可逆加密

顾名思义就是可以通过特定密钥从加密后的密文中推算出明文的加密算法,这个加密算法是可逆的

1.1 对称加密(传统加密算法)

在这里插入图片描述
A发送时计算机使用加密算法和加密密钥对明文加密后通过网络传输给B,
B接收时计算机使用解密算法和解密密钥对接收的信息进行解密得到明文;
过程中需要通过安全信道传输密钥
So:
1、加密强度不高,但加密速度快效率高
2、密钥分发困难,密钥管理困难

大部分情况下使用对称加密具有不错的安全性,适合大数据量的加解密处理;

1.2 非对称加密(现代加密算法)

在这里插入图片描述
A、B各有自己的公用密钥私用密钥(公钥和私钥成对存在,公钥加密后,只有对应的私钥才能解密)
A发送时根据接受方B的公用密钥对明文加密后通过网络传输给B,
B接收时使用解密算法和私钥对接收的信息进行解密得到明文;
So: 加密速度比较慢、但是安全性高,适合小数据量加解密

这里使用非对称加密的话,存在一个问题:

假设有一个中间人 C,在A想发消息给B获取B公钥的时候,被C拦截后把假公钥给了A并获取B的公钥;
A据假公钥加密并发送信息给B,C再次拦截后用假公钥对应的私钥破解消息后把消息根据B公钥加密发送给B;
这个就是中间人的关键问题在于,A怎么确定B就是B?B怎么证明我就是我? 也就是身份验证问题
除了身份验证问题,带来的还有内容泄露问题数据完整性问题,那么该如何解决这些问题?

答案是采用 混合加密、消息摘要、数字签名的方法,想了解这些方法还得先了解不可逆加密;(见后文)

二、不可逆加密

顾名思义就是一种不可逆的加密方式,比如MD5,常常用于保存密码以及生成数字签名;

MD5是不可逆的,那为什么有一堆能解密的网站呢? 比如:https://md5.cn/;
首先得知道为啥MD5是不可逆的,MD5不可逆的原因是由于它是一种散列函数也叫哈希函数,哈希函数可以将任意长度的输入经过变化后得到固定长度的输出,这个固定长度的输出称为原消息的散列消息映射。并且由于在计算过程中原文的部分信息丢失,所以无法根据计算结果和计算过程推出原文。

理想的哈希函数可以针对不同的输入得到不同的输出,如果存在两个不同的消息得到了相同的哈希值,那我们称这是一个碰撞

我们常见的碰撞法:暴力碰撞(穷举法、字典法),就是利用计算机的资源尝试碰撞已知的MD5码。

1、穷举法

穷举法就是不停地尝试各种字符的排列组合,看哪一个组合的MD5码能对上。缺点是太耗费时间。举个例子,假设我们要破解一个6位大小写字母和数字混合的密码,那么一共有 (26 + 26 + 10) ^ 6 种组合。这个数的大小超过500亿。

2、字典法

字典法就是把计算结果以映射表的形式存放起来,一个原文对应着一个MD5值。将已知的MD5码查表,就可直接反查出原文。字典法体现了算法设计的“以空间换时间”的思想。缺点是比较耗费空间,而且实际上还是要穷举一遍所有的输入,只不过把穷举的结果存了起来。

有了以上了解,这里就可以回答问题了:
网上搜索到的md5解密网站是成千上万的md5原文和md5密文,放到了数据里,所谓的解密就是从数据库里查询有没有原文。

这种网站相当于md5的字典库,就是原文和密文的的对应表,数据量很庞大,上万亿级别,如果用户的密文正好在字典库里面,一查对应表就行。很多用户的密码都不够复杂,所以很容易被这种方式生成出来。一般网上这种md5解密网站能解密8位数左右的纯数字密码。密码太复杂的话,要根据这个网站的数据库和数据量而定。所以,平常尽量不要使用这种网站避免被把输入的原文和密文保存到字典中,而且最好平常密码设计长一点复杂一点;

后端开发过程中可避免的方法就是加盐,把用户传过来的字符串和自定义的字符串进行拼接后再MD5加密,加密次数可以多几次后再存入数据库;

三、 混合加密、消息摘要和数字签名

混合加密: 结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。

消息摘要(数字摘要): 通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。

数字签名技术: 数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把公钥加密技术和数字摘要结合起来,形成了实用的数字签名技术。

在这里插入图片描述
发送方对发送的原文通过hash函数加密生成消息摘要,发送方通过私钥加密对消息摘要生成数字签名,表示这个消息是我发的;
接受方对接受的原文通过hash函数解密生成消息摘要2,接收方通过发送方公钥对收到的签名摘要解密生成消息摘要1,两者消息摘要进行比对,这样就能确认文件内容是否被修改;

这样通过混合加密、消息摘要的方法就能解决数据完整性的问题;

常用的消息摘要算法(也就是不可逆算法也叫哈希算法):MD5(散列值128)、SHA(散列值160);

怎么解决身份验证问题呢? 回顾之前的非对称加密中的问题如下图:
在这里插入图片描述
这里就要用 数字签名技术 了,
在这里插入图片描述

数字证书内容

包括了加密后服务器的公钥、权威机构的信息、服务器域名,还有经过CA私钥签名之后的证书内容(经过先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。

验证证书安全性过程

当客户端收到这个证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过CA公钥解密得到证书信息摘要。
然后证书签名的方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。
那第三方攻击者能否让自己的证书显示出来的信息也是服务端呢?(伪装服务端一样的配置)显然这个是不行的,因为当第三方攻击者去CA那边寻求认证的时候CA会要求其提供例如域名的whois信息、域名管理邮箱等证明你是服务端域名的拥有者,而第三方攻击者是无法提供这些信息所以他就是无法骗CA他拥有属于服务端的域名。

四、文章最后

其实,这个些问题主要就是Https所实现的主要功能,也是平时为啥使用Http会被提示不安全,之后还想梳理的就是Token令牌的使用以及加密算法在实际开发中的应用,Token主要就是不能说每次传输都加密解密啥的进行验证,这样会增加暴露的风险。
所谓的Token,其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。
之后慢慢填坑吧;https://zhuanlan.zhihu.com/p/344173246

;