`

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

阅读更多

说明

(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加密

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

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

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

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

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

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

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

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

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

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

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

分享到:
评论

相关推荐

    Spring Boot + Security

    Spring Boot和Spring Security是Java开发领域中两个非常重要的框架,它们在构建现代Web应用程序时起着核心作用。Spring Boot简化了Spring应用的初始搭建以及开发过程,而Spring Security则提供了全面的安全管理解决...

    Spring security 自定义密码加密方式的使用范例。

    在Spring Security中,默认使用的是BCryptPasswordEncoder或者PBEWithMD5AndDES等加密算法。但为了满足特定需求,我们可以自定义密码编码器。下面是如何实现的步骤: 1. **创建自定义PasswordEncoder**:你需要创建...

    在Spring Boot中使用Spring Security实现权限控制

    本文将深入探讨如何在Spring Boot项目中利用Spring Security进行权限控制,并结合BCrypt加密技术来增强用户密码的安全性,同时也会提及如何使用Thymeleaf模板引擎来呈现动态安全的界面。 首先,我们需要理解Spring ...

    Packtpub.Spring.Security.3.May.2010.rar

    9. **自定义扩展**:Spring Security允许开发者自定义认证提供者、权限决策管理器、加密算法等,以适应特定的安全需求。 10. **Web安全增强**:Spring Security 3对HTTP头进行了优化,例如设置X-XSS-Protection、X-...

    jasypt-spring-boot-starter 3.0.5依赖的pom及jar

    这些依赖包括了jasypt本身,Spring Boot的相关组件,以及其他可能需要的库,如加密算法支持、日志框架等。理解POM文件的内容有助于我们了解项目所依赖的外部资源,确保在运行时能够找到所有必需的类和方法。 接着,...

    spring boot security 项目

    Spring Boot Security是一个强大的框架,用于在Spring Boot应用中实现安全控制。它简化了Spring Security的配置,使得开发者能够快速地为应用程序添加认证和授权功能。在这个项目中,我们将会探讨Spring Boot ...

    springboot+springSecurity+jwt实现的基于token的权限管理的一个demo

    这个“springboot+springSecurity+jwt实现的基于token的权限管理的一个demo”旨在演示如何在Spring Boot应用中集成这些技术,以创建一个安全的、基于令牌的身份验证系统。 首先,Spring Boot是Java领域的一个快速...

    spring-boot示例项目

    encoder|[主流加密算法介绍、用户加密算法推荐](https://github.com/smltq/spring-boot-demo/blob/master/encoder/HELP.md) actuator|[autuator介绍]...

    spring boot + jwt登录

    Header通常包含令牌的类型("jwt")和加密算法;Payload则存储实际的数据,如用户ID、角色等,但不应包含敏感信息;Signature是前两部分通过秘钥加密后的结果,用于验证令牌的完整性和来源。 在Spring Boot中实现...

    Spring Boot整合JWT

    Header包含了JWT类型和加密算法;Payload存储了声明信息,如用户ID、角色等;Signature则是通过Header和Payload与密钥进行哈希运算生成,用于验证消息的完整性和来源的可靠性。 整合Spring Security是Spring Boot...

    springboot md5实例

    MD5是一种非对称加密算法,它可以将任何大小的数据转换为128位的哈希值,通常表示为32个十六进制数字。由于其单向性和碰撞概率极低的特性,MD5常用于验证数据完整性,尽管其安全性在近年来已受到一定质疑,但仍常见...

    Spirng+SpringMVC+SpringSecurity+Thymeleaf+基于Java配置的登录小项目.zip

    1. **主配置类**:这个类会启用Spring Boot的自动配置,并定义SpringMVC和SpringSecurity的相关配置。 2. **用户实体类**:定义了用户的属性,如用户名、密码等,通常还会包含一些用于验证的注解。 3. **用户服务...

    SM2,SM3,SM4 Spring boot 开发实例

    Spring Boot提供了丰富的安全框架,例如Spring Security,可以帮助我们更方便地集成这些加密算法。 综上所述,SM2、SM3和SM4是Java后端开发中实现数据安全的重要工具。通过集成BouncyCastle库,我们可以轻松地在...

    spring security+jjwt

    Signature是通过Header中的算法(如HS256)和私钥对Header和Payload进行加密,用于防止篡改。 4. **JWT的刷新机制**: - 为了处理JWT的过期问题,通常会引入一个刷新令牌(Refresh Token)。当JWT接近过期时,...

    spring security+jwt 实现 restful api格式.

    Header标识了token类型和加密算法,Payload存储用户信息(非敏感数据)和其他声明,Signature用于验证token的完整性和来源。在发送请求时,JWT通常放在HTTP请求头的Authorization字段中,格式为`Bearer <token>`,...

    spring boot 登陆注册的全部代码。

    Spring Security 提供了 BCryptPasswordEncoder 或者 Argon2PasswordEncoder 等加密算法,确保即使数据库被泄露,原始密码也不会暴露。 5. **前后端交互**: 前后端可以通过 RESTful API 进行通信。Spring Boot 提供...

    spring boot 基于数据库整合OAuth2

    在Spring Boot中,我们可以使用Spring Security OAuth2模块来实现这些功能。 1. **设置OAuth2授权服务器**:在Spring Boot项目中,我们需要创建一个授权服务器来处理用户的授权请求。这可以通过实现`...

    Spring Boot项目08之个人中心设置功能模块项目源码

    在本项目中,我们主要探讨的是如何在Spring Boot框架下实现个人中心设置功能模块。Spring Boot以其简洁的配置、快速的开发效率以及丰富的生态体系,成为现代Java Web开发的首选框架之一。在这个项目中,我们将深入...

    确保rest-api-spring-security:Spring Boot 2.2.x + Spring 5.2.x Rest Api安全示例

    这个类会包含加密算法和令牌的过期时间等配置。 **4. 自定义登录逻辑** 创建一个`LoginController`,处理登录请求,验证用户凭证,并返回JWT令牌。 ```java @RestController @RequestMapping("/auth") public ...

    Spring Boot 中密码加密的两种方法

    Spring Boot 是一个流行的Java开发框架,它简化了创建独立、生产级别的基于Spring的应用程序。在Spring Boot中,处理用户密码的安全性是至关重要的。本文将详细介绍两种密码加密的方法,以帮助开发者更好地理解和...

Global site tag (gtag.js) - Google Analytics