256.Spring Boot+Spring Security: MD5是加密算法吗?

时间:2023-11-25 19:09:08

说明

(1)JDK版本:1.8

(2)Spring Boot 2.0.6

(3)Spring Security 5.0.9

(4)Spring Data JPA 2.0.11.RELEASE

(5)hibernate5.2.17.Final

(6)MySQLDriver 5.1.47

(7)MySQL 8.0.12

前言

有网友在公众号留言:准确的说md5是摘要算法不是加密算法

针对这个问题,当时也没有仔细的思考,空下来的时候,对于这个问题整理了下思路。

一、加密算法

1.1 加密和解密

1.1.1 加密

数据加密 的基本过程,就是对原来为明文 的文件或数据按 某种算法 进行处理,使其成为不可读 的一段代码,通常称为“密文”。通过这样的途径,来达到 保护数据 不被 非法人窃取、阅读的目的。

1.1.2 解密

加密 的 逆过程 为解密,即将该 编码信息 转化为其 原来数据 的过程。

1.2对称加密和非对称加密

加密算法分 对称加密 和 非对称加密,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密 密钥不同。

常见的 对称加密 算法主要有 DES3DESAES 等,常见的 非对称算法 主要有 RSADSA 等

1.2.1 对称加密算法

对称加密算法 是应用较早的加密算法,又称为共享密钥加密算法。在 对称加密算法 中,使用的密钥只有一个,发送 和 接收 双方都使用这个密钥对数据进行 加密 和 解密。这就要求加密和解密方事先都必须知道加密的密钥。

分析:

(1)数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和 加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文进行发送。

(2)数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。

1.2.2 非对称加密算法

非对称加密算法,又称为公开密钥加密算法。它需要两个密钥,一个称为公开密钥 (public key),即 公钥,另一个称为 私有密钥(private key),即 私钥。

因为 加密 和 解密使用的是两个不同的密钥,所以这种算法称为 非对称加密算法。

(1)如果使用 公钥对数据 进行加密,只有用对应的 私钥 才能 进行解密。

(2)如果使用 私钥对数据 进行加密,只有用对应的 公钥 才能 进行解密。

二、摘要算法

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

举个例子,你写了一篇文章,内容是一个字符串'how to use pythonhashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to usepython hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to usepython hashlib - by Bob'计算出的摘要不同于原始文章的摘要。

可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

摘要算法 主要有 SHA-1MD5 等。

2.1 MD5是加密吗?

MD5严格意义上来讲,不是加密算法,而是摘要算法/散列算法,或者叫做哈希算法。

加密算法的目的,在于别人无法成功查看加密后的数据,并且在需要的时候还可以对数据进行解密来重新查看数据。而 MD5 算法是一种哈希算法,哈希算法的设计目标本身就决定了,它在大多数时候都是不可逆的,即你经过哈希算法得出的数据,无法再经过任何算法还原回去。所以,既然不能将数据还原,也就不能称之为可以解密;既然不能解密,那么哈希的过程自然也就不能称作是「加密」了。

简单理解:

加密后的消息是完整的;具有解密算法,得到原始数据;

摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据。

2.2 MD5算法是如何被破解的?

2.2.1 何谓破解?

有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到。

对于MD5的破解,实际上都属于【碰撞】。比如原文A通过MD5可以生成摘要M,我们并不需要把X还原成A,只需要找到原文B,生成同样的摘要M即可。

2.2.2 破解之法

MD5碰撞的方法有很多,主要包括暴力枚举法、字典法、彩虹表法等等。

暴力枚举法:顾名思义,就是简单粗暴地枚举出所有原文,并计算出它们的哈希值,看看哪个哈希值和给定的信息摘要一致。这种方法虽然简单,但是时间复杂度极高。

字典发:利用一个巨大的字典,存储尽可能多的原文和对应的哈希值。每次用给定的信息摘要查找字典,即可快速找到碰撞的结果。这样做虽然每次破解速度很快,但是生成字典需要巨大的空间,大约需要4.65PB的存储空间

对于彩虹表法这个理解起来就比较复杂了,有兴趣的小伙伴可以找资料了解下。

2.3 md5是唯一的吗?

md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。也就是一个原始数据,只对应一个md5值;但是一个md5值,可能对应多个原始数据。

参考资料:

MD5算法如何被破解

https://blog.csdn.net/wufaliang003/article/details/79794982

浅谈常见的七种加密算法及实现

https://blog.csdn.net/baidu_22254181/article/details/82594072

摘要算法简介

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328251266d86585fc9514536a638f06b41908d44000

MD5 加密算法详细介绍

https://blog.csdn.net/ling_du/article/details/51452091

MD5 到底是不是加密?

https://blog.csdn.net/lspq35k7o5aj21l1h9o/article/details/81073726

历史文章

214. Spring Security:概述

215.Spring Boot+Spring Security:初体验

216.Spring Boot+Spring Security:基于内存的认证信息

217.Spring Boot+Spring Security:基于内存的角色授权

218.Spring Boot+Spring Security:基于内存数据库的身份认证和角色授权

219.Spring Boot+Spring Security:基于MySQL数据库的身份认证和角色授权

220.Spring Boot+Spring Security:自定义登录页面和构建主页

221.Spring Boot+Spring Security:登出和403处理

222.Spring Boot+Spring Security:动态加载角色

223.Spring Boot+Spring Security:原理1

224.Spring Boot+Spring Security:自定义Filter

246.Spring Boot+Spring Security:页面白名单和获取登录信息

13. Spring Boot+Spring Security:基于URL动态权限n种方案

248.Spring Boot+Spring Security:基于URL动态权限:准备工作

249.Spring Boot+Spring Security:基于URL动态权限:扩展access()的SpEL表达式

250.Spring Boot+Spring Security:基于URL动态权限:自定义AccssDesionManager

251.Spring Boot+Spring Security:基于URL动态权限:自定义Filter

252.Spring Boot+Spring Security:标签sec:authorize的使用

253.Spring Boot+Spring Security:获取用户信息和session并发控制

254.Security注解:@PreAuthorize,@PostAuthorize, @Secured, EL实现方法安全

255.Spring Boot+Spring Security:使用md5加密

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:http://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/R3QepWG

Spring Cloud视频:http://t.cn/R3QeRZc

SpringBoot Shiro视频:http://t.cn/R3QDMbh

SpringBoot交流平台:http://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/R1pSojf

SpringSecurity5.0视频:http://t.cn/EwlLjHh

Sharding-JDBC分库分表实战:http://t.cn/E4lpD6e