加盐加密算法

    • MD5加密
    • 加盐加密
    • 项目密码升级

MD5加密

MD5一系列公式进行复杂数学运算;特点:(用途校验和、计算hash值方式、加密)
1:定长;无论原始数据多长;算出的结果都是4或者8字节的版本。
2:冲突概率很小;就算你只改动一个地方;但是计算的结果相比之下是非常大
3:不可逆;正着计算很容易;逆着计算理论不可能实现;计算量很大;当前的条件是不可能实现

彩虹表:网上解密的工具只能把一些常见的字符串MD5值保存好;然后进行查表的值;并不是真实的计算出结果。
在这里插入图片描述
java中如何将一段这种字符串的password进行MD5加密呢:
DigestUtils.md5DigestAsHex是Apache Commons Codec库中的一个工具方法,用于计算传入参数的MD5哈希值,并返回一个16进制字符串表示的结果。
传入的参数需要是一个字节数(byte[])或字符串(String)。如果参数是字符串,则会自动将其转换为对应的字节数组。

String password="12345678";
String md5password=DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println(md5password);

同一个字符串md5的值一个固定值;如果人家获取到你的md5这个值;破解密码随随便便;直接遍历彩虹表穷举;相当于加一把没带钥匙的锁

加盐加密

加密:密码+随机盐值 进行md5加密
解密:我们也没法解;因为是不可逆的;我们记住加密规则;再走一遍流程;对比用户登录的密码和数据库的是否一样

盐值:
我们得知道盐值是什么;才能重新再走一遍的规则;那就涉及盐值怎么来的;怎么储存

获取盐值:

String salt=UUID.randomUUID().toString().replace("-","");
//UUID一般被表示为32个字符的十六进制数,最常用的格式是8-4-4-4-12的五段分割
//例如:c4a760a8-dbcf-11e9-8f92-2b1af3aec0a6;我们把横杠去掉;替换成空字符串

你的盐值要每次不一样(每个用户的是不一样);那么就使用uuid;时间戳有可能重复。多个人的随机盐值是一样;会造成破解多个和破解一个是一样难度。

储存盐值:
方式1:盐值和密码单独存储两个字段(如果对方破解你数据库内容;那就很危险;相当于我告诉黑客;盐值是……;你自己去用彩虹表加密遍历一下和我的这个密码对比) 不现实
方式2:盐值和密码整合一起;存在一个字段。(用一个分隔符;分割哪里是盐值;哪里是MD5后的密码;给黑客破解增加难度;它还得猜你哪个是分隔符;那边是盐值;哪边是密码)
使用一个规则约定这里盐值和密码:分隔符(缺点;传递的正文不能有这个分隔符)?或者是按位数;前32位存盐值、后32位存密码。

为什么加盐值后破解成本大大提升:
假设我的盐值是1-n(实际更复杂);要暴力破解对应n个彩虹表;得拿盐值去和彩虹表的每一个进行MD5再和我们的密码对比。而且这样子破解的只是一个用户。

代码实现:

package com.example.demo.service;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

public class salt_encrypt {
    //加密过程;相当于注册的时候要用于存进去数据库的password字段
        public static String encrypt(String reg_password){
        String salt= UUID.randomUUID().toString().replace("-","");
        String md5password= DigestUtils.md5DigestAsHex((reg_password+salt).getBytes());
       String dbpassword=salt+"$"+md5password;
        return dbpassword;
    }

    public static boolean decrypt(String login_password,String dbpassword){
            boolean result=false;
            //判空操作
            if(StringUtils.hasLength(login_password)&&StringUtils.hasLength(dbpassword)){
              //取出盐值
              String [] dbpassword1=dbpassword.split("\\$");
//                因为 "$" 在正则表达式中具有特殊含义。在正则表达式中,"$" 表示行结束的位置,
//                如果不进行转义,正则表达式会将它解释为行结束符意思,而不是普通的字符 "$"。
              String salt=dbpassword1[0];
              String dbpassword2=dbpassword1[1];//获取我们直接用数据库的盐值+分隔符+md5密码是否包含这个要验证的密码md5值
              login_password=DigestUtils.md5DigestAsHex((login_password+salt).getBytes());
              if(dbpassword1.equals(login_password)){
                  result=true;
                  
              }


            }
         return result;

    }



}

项目密码升级

代码改造:
UserController的注册;修改前在这里插入图片描述
修改后:存的密码变成加盐md5后的
在这里插入图片描述
UserController的登录:修改前
在这里插入图片描述
修改后:
在这里插入图片描述

检查数据库password的字段是否是65位的;因为我们之前可能没使用加盐加密就没考虑那么多;如果我们之前随时password varchar(32)那么可以通过alter table userinfo modify column password varchar(65);进行修改

验证:
注册成功;且储存的密码样式是我们需要的。登录成功;说明验证是通过了。
在这里插入图片描述
Spring 框架提供了有加盐加密的方式,最常用的是Spring Security :
1:使用先添加Security框架
2:内置一个登录页面;我们得把这个关闭掉(因为我们自己有登录页面;不需要用它的)
在这里插入图片描述

它会在控制台提供一个密码给你
在这里插入图片描述
如何关闭:
在启动类添加这个(自动注入;关闭这个类自动的加载;但是APi还是能用的;因为我们把这个依赖加入项目了;;spring是真的默认是自动加载的)
在这里插入图片描述
使用:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nodejs+vue+elementui汽车租赁管理系统_1ma2x

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui, 课题主要分为三大模块:即管理员模块、用户模块和普通管理员模块,主要功能包括&#…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

Element组件浅尝辄止2:Card卡片组件

根据官方说法: 将信息聚合在卡片容器中展示。 1.啥时候使用?When? 既然是信息聚合的容器,那场景就好说了 新建页面时可以用来当做页面容器页面的某一部分,可以用来当做子容器 2.怎样使用?How? //Card …

30.基于XML的声明式事务

基于XML的声明式事务 主要是使用XML去代替注解&#xff0c;来实现起到代替注解的作用&#xff0c;实际使用频率很低 将BookServiceImpl.java中的Transactional注解删除&#xff0c;确保用户余额充足 spring-tx-xml.xml <?xml version"1.0" encoding"UTF-8…

Linux:Shell编辑之文本处理器(sed)

目录 绪论 1、sed的原理&#xff1a;读取 执行 显示 三个过程 2、sed 文本内容处理工具&#xff0c;文件过大怎么办&#xff1f; 3、sed的操作选项 3.1 常用选项 3.2 操作符 3.3 行号的范围打印 3.4 对包含指定字符串的内容进行打印 3.5 删 3.5.1 正则表达式删除 3.6…

DNS:使用 bind9 配置主从权威DNS服务器

写在前面 分享一些 使用 bind9 配置主从权威名称服务器的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

笔记本电脑如何把sd卡数据恢复

在使用笔记本电脑过程中&#xff0c;如果不小心将SD卡里面的重要数据弄丢怎么办呢&#xff1f;别着急&#xff0c;本文将向您介绍SD卡数据丢失常见原因和恢复方法。 ▌一、SD卡数据丢失常见原因 - 意外删除&#xff1a;误操作或不小心将文件或文件夹删除。 - 误格式化&#…

【资讯速递】AI与人类思维的融合;OpenAI在中国申请注册“GPT-5”商标;移动大模型主要面向to B 智能算力是未来方向

2023年8月11日 星期五 癸卯年六月廿五 第000001号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…

C++初阶之一篇文章教会你list(理解和使用)

list&#xff08;理解和使用&#xff09; 什么是list特点和优势基本操作示例用法与其他序列式容器&#xff08;如 std::vector 和 std::deque&#xff09;相比&#xff0c;std::list 显著的区别和优势成员类型 list构造函数1. default (1)2. fill (2)3.range (3)4. copy (4) li…

ubuntu20.04磁盘满了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

问题 执行 mysql 大文件导入任务&#xff0c;最后快完成了&#xff0c;查看结果发现错了&#xff01;悲催&#xff01;都执行了 两天了 The table ‘XXXXXX’ is full &#xff1f; 磁盘满了&#xff1f; 刚好之前另一个 centos 服务器上也出现过磁盘满了&#xff0c;因此&a…

什么是Selenium?使用Selenium进行自动化测试

什么是 Selenium&#xff1f;   Selenium 是一种开源工具&#xff0c;用于在 Web 浏览器上执行自动化测试&#xff08;使用任何 Web 浏览器进行 Web 应用程序测试&#xff09;。   等等&#xff0c;先别激动&#xff0c;让我再次重申一下&#xff0c;Selenium 仅可以测试We…

大连交通大学813软件工程考研习题

1.什么是软件生存周期模型?有哪些主要模型? 生存周期模型&#xff1a;描述软件开发过程中各种活动如何执行的模型。对软件开发提供强有力的支持&#xff0c;为开发过程中的活动提供统一的政策保证&#xff0c;为参与开发的人员提供帮助和指导&#xff0c;是软件生存周期模型…

云计算——常见存储类型

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.存储类型 1.本地磁盘 2.DAS 3.NAS 4.SAN &#xff08;1&#xff09;FC SA…

锁定Mac的内置键盘,防止外接键盘时的误触

场景&#xff1a;把你的外接键盘放在mac上&#xff0c;然后打字时&#xff0c;发现外接键盘误触mac键盘&#xff0c;导致使用体验极差 解决方案&#xff1a;下载Karabiner-Elements这款软件&#xff0c;并给它开启相关权限。 地址&#xff1a;https://github.com/pqrs-org/Ka…

ModaHub魔搭社区——Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch矢量数据库对比

资本市场上,2022年也是风起云涌的一年的,各大向量数据库公司纷纷完成了千万美元级别新一轮的融资。可以预见,2023年将会是向量数据库继续快速发展的一年,也会是这一新兴技术由发展走向成熟的一年。这里针对Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch这五个流行的…

编写简单的.gitlab-ci.yml打包部署项目

服务器说明&#xff1a; 192.168.192.120&#xff1a;项目服务器 192.168.192.121&#xff1a;GitLab 为了可以使用gitlab的cicd功能&#xff0c;我们需要先安装GitLab Runner 安装GitLab Runner参考&#xff1a; GitLab实现CICD自动化部署_gitlab cidi_程序员xiaoQ的博客-CS…

HCIA---TCP/UDP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一.UDP协议简介 UDP协议的特点&#xff1a; 二.TCP协议简介 TCP协议特点 三.TCP和UDP的区别 四.TCP/IP结构详解 五.TCP运输连接的阶段 ​编辑 …

43..利用fsolve函数解对应lambda下的方程组(matlab程序)

1.简述 fsolve的基本用法 : x fsolve(fun,x0) 其中fun应为函数句柄&#xff0c;x0为搜索的种子&#xff0c;即预估的fun0的解的大致位置。 函数句柄的定义方式主要有两种&#xff1a; 1.定义函数文件&#xff0c;使用操作符 定义function文件root2d.m, 如下&#xff1a; …

怎么把图片表格转换成word表格?几个步骤达成

在处理文档时&#xff0c;图片表格的转换是一个常见的需求。而手动输入表格是非常耗时的&#xff0c;因此&#xff0c;使用文本识别软件来自动转换图片表格可以大大提高工作效率。在本文中&#xff0c;我们将介绍如何使用OCR文字识别技术来将图片表格转换为Word表格。 OCR文字识…