加盐加密算法

    • 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是真的默认是自动加载的)
在这里插入图片描述
使用:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程实战

Java多线程实战 java多线程(超详细) java自定义线程池总结 Java创建线程方式 方法1,继承Thread类 方法2,实现Runable接口 方法2-2,匿名内部类形式lambda表达式 方法3,实现Callable接口,允许…

【深入理解Linux内核锁】三、原子操作

我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、原子操作思想2、整型变量原子操作2.1 API接口2.2 API实现2.2.1 原子变量结…

log4j:WARN No appenders could be found for logger问题

本文将idea场景下的使用。 IDEA中,将配置文件命名为log4j.properties(该命名才会被自动加载), 并放到某个目录下(通常放到resources目录),并在resources上右键,找到Mark Directory a…

微信程序 自定义遮罩层遮不住底部tabbar解决

一、先上效果 二 方法 1、自定义底部tabbar 实现: https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 官网去抄 简单写下:在代码根目录下添加入口文件 除了js 文件的list 需要调整 其他原封不动 代码&#xf…

【路由协议】使用按需路由协议和数据包注入的即时网络模拟传递率(PDR)、总消耗能量和节点消耗能量以及延迟研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

斯坦福「小镇」开源AI智能体;小米应用商店将要求AI应用符合资质标准

🦉 AI新闻 🚀 斯坦福「小镇」开源AI智能体 摘要:斯坦福研究人员开源了一个类似《西部世界》的数字化「小镇」,里面有25个AI智能体可以生活、工作、社交。这项研究被视为AGI的重要开端,可能会改变游戏、企业应用领域。网友期待这项技术改善游戏NPC的交互…

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序,用于将PDF文件转换为旋转90度的PDF文件。主要用于csdn网站中导出的博客pdf是横向的,看起来不是很方便,才想到用python编制一个将pdf从横向转为纵向的功能。 功能 该PDF转换工具具有以下功能&#xff1a…

信息安全:防火墙技术原理与应用.

信息安全:防火墙技术原理与应用. 防火墙是网络安全区域边界保护的重要技术。为了应对网络威胁,联网的机构或公司将自己的网络与公共的不可信任的网络进行隔离,其方法是根据网络的安全信任程度和需要保护的对象,人为地划分若干安全…

C#工程建立后修改工程文件名与命名空间

使用之前的项目做二次开发,项目快结束的时候,需要把主项目的名称修改成我们想要的。 之前从来没有这么干过,记录一下。 步骤如下: 1:打开vs2010项目解决方案,重命名,如下图所示: …

设计模式之原型模式Prototype的C++实现

1、原型模式提出 在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。…

Docker基础入门:镜像、容器导入导出与私有仓库搭建

Docker基础入门:镜像导入导出与私有仓库搭建 一、 Docker镜像、容器的导入和导出1.1、Docker镜像的导出1.2、Docker镜像的载入1.3、Docker容器的导出1.4、Docker容器的导入 二、 镜像和容器导出和导入的区别:三、commit操作_本地镜像发布到阿里云3.1、commit操作有关…

ppt中线材相交接的地方,如何绘画

ppt中线材相交接的地方: 在ppt中绘画线材相互交接的地方: 1.1绘图工具中的“弧形” 1.2小技巧 “弧形”工具点一下,在ppt中如下 1.3拖动活动点进行调整图形 1.4绘画圆弧 1.5调整“圆弧”的大小,鼠标放在“黄色点”位置&#xf…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

【数据结构】二叉搜索树

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C 📕 学习格言:博观而约取&…

亿赛通电子文档安全管理系统任意文件上传漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

excel隔行取数求和/均值

问题描述 如图有好多组数据,需要求每组数据对应位置的平均值 解决方法 SUM(IF(MOD(ROW(C$2:C$81), 8) MOD(ROW(C2), 8), C$2:C$81, 0))/10然后下拉右拉扩充即可,其中需要根据自身需要修改一些数据 SUM(IF(MOD(ROW(起始列$起始行:结束列$结束行), 每…

MATLAB图论合集(一)基本操作基础

本帖总结一些经典的图论问题,通过MATLAB如何计算答案。近期在复习考研,以此来巩固一下相关知识——虽然考研肯定不能用MATLAB代码哈哈,不过在实际应用中解决问题还是很不错的,比C易上手得多~ 图论中的图(Graph&#xf…

FOSSASIA Summit 2023 - 开源亚洲行

作者 Ted 致歉:本来这篇博客早就该发出,但是由于前几个月频繁差旅导致精神不佳,再加上后续我又参加了 Linux 基金会 7/27 在瑞士日内瓦举办的 Open Source Congress,以及 7/29-30 台北的 COSCUP23,干脆三篇连发&#x…

仪表板展示 | DataEase看中国:2023年中国电影市场分析

背景介绍 随着《消失的她》、《变形金刚:超能勇士崛起》、《蜘蛛侠:纵横宇宙》、《我爱你》等国内外影片的上映,2023年上半年的电影市场也接近尾声。据国家电影专资办初步统计,上半年全国城市院线票房达262亿元,已经超…