手写一个加盐加密算法(java实现)
目录
前言
什么是MD5??
加盐算法
那别的人会不会跟你得到相同的UUID?
如何使用盐加密?
代码实现
前言
对于我们常见的登录的时候需要用到的组件,加密是一个必不可少的东西,如果我们往数据库存放用户的密码,是直接以明文存储的话,那么数据被窃取的时候,损失也就是最大的,因为别人可以很直观的看到你的用户数据,不需要任何破解成本。
所以我们需要对其加密。
目前最常见的两种数据加密方法:
- MD5加密
- 加盐算法
什么是MD5??
简单来说,md5就是讲遗传字符串通过某种特定的算法,来将其变化成另外一种形式,这样子就从明文的外观变成另外一个样子。但是由于背后的算法格式是固定的,所以每一个字符串都有固定的MD5格式。
有的用户为了方便记忆,把密码设置成简单的,有规律的字母或者数字组合,有的也喜欢使用单独一个单词这种,举一个简单的例子,例如密码1234567,和密码1726354,这两种密码,因为格式简单,很容易就被一次一次的试出来,也就是被暴力破解。
然后我们使用1234567进行MD5加密,但是这样就会让数据完全处于安全状态吗?
具体如何破解?也就是讲得到的,讲得到的密码进行MD5转换成为对应的哈希,然后于最初的哈希进行比对,要是匹配,那么这个密码就已经暴露给别人了
MD5底层存在一张彩虹表,几乎标记了所有字符串的MD5对照表。
有了彩虹表MD5就相当于是不存在了,因为一种字符串就只有一种特定的MD5格式
加盐算法
什么是盐?
其实盐就是一个随机值,没有任何规律,通过UUID.randomUUID()来生成一个唯一盐值。这个uuid是唯一的,具体唯一就是根据你的mac地址等内容生成的一个世界唯一的值,
那别的人会不会跟你得到相同的UUID?
下面的内容来自百度百科:
官方说明:产生错误的情况非常低,是故大可不必考虑这个重复的问题
如何使用盐加密?
这里存在一个合约公式,也就是:盐值(32位)+ $ + MD5加密后的密码
加密思路:用户输入一个明文密码,通过UUID得到一个盐值,这段密码首先使用MD5和盐值进行一个基本的加密,然后使用合约公式,将盐值和使用MD5+盐值生成的合约公式存入数据库
如何解密:这里的解密,不是指的直接将我们得到的合约公式又解密成明文,比如,用户想要登录,于是他输入了他之前设置的密码。这个密码被后端得到之后,就会进行验证,具体就是首先记住这个明文,然后通过数据库中存储的对应用户的合约公式拿出来,通过$来获取盐值,然后将用户输入的明文和拿到的盐值进行MD5加密,然后再合成一个:
盐值(32位)+ $ + MD5加密(盐值+用户输入的密码),
那么现在就有两个合约公式了,一个是用户注册时候生成的,一个是用户刚刚输入的,后台自动生成的合约公式
如果两个合约公式是一样的,那么就说明现在正在登录这个账户的人是这个账户的持有者,就可以允许访问
代码实现
在实现这个功能之前,你需要引入一个工具类,可以前往maven下载,地址为:
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version> <!--根据需要选择合适版本-->
</dependency>
代码案例:
import org.apache.commons.codec.digest.DigestUtils;public class Main {public static void main(String[] args) {String input = "Hello World"; // 输入字符串// 计算MD5值String md5Hash = DigestUtils.md5Hex(input);System.out.println("MD5 Hash: " + md5Hash);}
}
根据上面的案例进行加密:
// import org.apache.commons.codec.digest.DigestUtils;
//
// import java.util.UUID;
public static String encrypt(String password) {// 首先生产一个盐值// UUID.randomUUID() 会生成32位数字,然后+4位‘-’,我们不需要关注‘-’在盐值的什么位置,我们只需要去除它String salt = UUID.randomUUID().toString();System.out.println(salt);// 去除‘-’salt = salt.replaceAll("-","");// 然后使用盐值和传进来的密码进行md5加密String saltPassowrd = DigestUtils.md5Hex((salt+password).getBytes());// 然后和盐值进行拼接,然后返回String finalPassword = salt + '$' + saltPassowrd;return finalPassword;}
}
解密:
解密的思路就是讲用户输入的密码重新进行一次加密,然后比对从数据库中拿到的是不是一样的:
public static boolean check(String inputPassword, String finalPassword){//首先判断这两个参数到底有没有值,并且判断数据库中拿到的finalPassword的length是否为65;if (inputPassword == null || inputPassword.isEmpty()) {// 这里先判断为不为空是因为后面的isEmpty的前提是字符串不为null,不然就会发生空指针异常return false;}if (finalPassword == null || finalPassword.isEmpty() || finalPassword.length() != 65) {return false;}// 从finalPassword中拿到盐值String salt = finalPassword.split("\\$")[0];String saltPassword = DigestUtils.md5Hex((salt+inputPassword).getBytes());String ret = salt + '$' + saltPassword;if (ret.equals(finalPassword)) {return true;}return false;}
相关文章:

手写一个加盐加密算法(java实现)
目录 前言 什么是MD5?? 加盐算法 那别的人会不会跟你得到相同的UUID? 如何使用盐加密? 代码实现 前言 对于我们常见的登录的时候需要用到的组件,加密是一个必不可少的东西,如果我们往数据库存放用户…...

基于Springboot的在线考试系统
点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88499371 mysql5、mysql8都可使用 内含配置教程文档,一步一步配置 Springboot所写 管理员页面 学生页面...

【React系列】JSX核心语法和原理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. ES6 的 class 虽然目前React开发模式中更加流行hooks,但是依然有很多的项目依然是使用类组件&#x…...

【C++初阶(九)】C++模版(初阶)----函数模版与类模版
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Permission denied
Permission denied:权限被拒绝,没有访问文件的权限。 查询对文件的权限: ls -l 文件名称 r为可读权限,w为可写权限,x为可执行权限。 授权文件rwx,可读可写可执行权限: chmod 777 文件名称 如…...

轻松学会电脑如何录制音频
随手录音,保留证据以便后续出现问题进行判定,或者保存会议音频记录方便后续根据录音内容整理自己会议记录不足之处等等;越来越多的地方需要用到录音,那么在电脑上该如何进行音频录制呢?特别是使用比较广泛的Windows电脑…...

react antd,echarts全景视图
1.公告滚动,40s更新一次 2.echarts图标 左右轮播 60s更新一次 3.table 表格 import { useState, useEffect } from react;import Slider from react-slick; import slick-carousel/slick/slick-theme.css; import slick-carousel/slick/slick.css;import Layout fro…...

GD32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件(附代码)
资料下载: https://download.csdn.net/download/wouderw/88714985 一、概述 关于IAP的原理和Ymodem协议,本文不做任何论述,本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级,以及bootloader和主程序两个工程的配置…...

【C#】知识点实践序列之UrlEncode在线URL网址编码、解码
欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是2024年第8篇文章,此篇文章是C#知识点实践序列文章, 博主能力有限,理解水平有限,若有不对之处望指正! 地址编码大家应该比较经常遇到和使用到&…...

泽攸科技完全自主研制的电子束光刻机取得阶段性成果
国产电子束光刻机实现自主可控,是实现我国集成电路产业链自主可控的重要一环。近日,泽攸科技联合松山湖材料实验室开展的全自主电子束光刻机整机的开发与产业化项目取得重大进展,成功研制出电子束光刻系统,实现了电子束光刻机整机…...

上篇 | CDP应用篇之兴趣标签的3种破圈玩法
谈到客户洞察,在这个以客户为中心、以数据为驱动的客户经营时代,贯通数据,联动CDP客户数据平台、SCRM、会员、营销一站式的客户洞察解决方案,成为了头部房企们的万千宠爱。其中关于人群兴趣标签的破圈玩法,我们结合过往…...

智能的核心依然是哲学的三个基本问题
智能的发展与哲学的三个基本问题密切相关,作为一个复杂领域,智能涉及到人类认知和行为的模拟与复制,因而也会涉及到哲学的核心问题。 存在论:智能的存在论问题涉及到什么是智能以及智能系统的本质。这包括对于意识、思维和自主性的…...
用python实现提取word中的所有图片
你可以使用python-docx库来处理word文件,然后遍历文件中的所有形状,找到图片。 首先,你需要安装python-docx库。在命令行中输入以下命令进行安装: 复制代码 pip install python-docx 然后,你可以使用以下代码提取wo…...
CoTracker 环境配置与ORB 特征点提取结合实现视频特征点追踪
CoTracker 环境配置&与ORB 特征点提取结合实现视频特征点追踪 文章目录 CoTracker 环境配置&与ORB 特征点提取结合实现视频特征点追踪Step1:配置 CoTracker 环境Step2:运行官方的例程Step3:结合 ORB 特征点提取结果展示: …...

10000000000 大瓜背后的真相(附 PDD 算法真题)
10 个亿的大事? 京东诉阿里强迫商家「二选一」,京东胜诉,获阿里赔偿 10 亿。 很多小伙伴见到公主号开创了锐评时事板块,当天就在后台留言问我看法。 先说结论:这是一则「媒体影响力」远大于「实际意义」的报道。 首先&…...
python爬虫,简单的requests的get请求,百度搜索实例
1、百度搜索实例 import requests url https://www.baidu.com/s? # key_word 迪丽热巴 key_word input(输入搜索内容:) headers {User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537…...
UNION 和 UNION ALL
概述 UNION 和 UNION ALL 都是 SQL 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。 区别 UNION 和 UNION ALL 的区别在于,UNION 会将结果集合并成一个不含重复行的结果…...

NPS 内网穿透安装
NPS 内网穿透安装 NPS 内网穿透安装服务端搭建SSH配置流程 NPS 内网穿透安装 NPS分为服务端和客户端,对应的不同操作系统软件可以在GitHub RELEASES自行选择下载。 服务端搭建 由于个人非企业级使用,为了方便直接使用docker安装 1.docker运行 (注意…...
【C++学习笔记】C++多值返回写法
C不像python可以轻易地处理多值返回问题,处理使用指针或者引用将需要返回的值通过参数带出来,还有几种特殊的方式。 引用自:https://mp.weixin.qq.com/s/VEvUxpcJPsxT9kL7-zLTxg 1. Tuple tie 通过使用std::tie,我们可以将tuple…...
读取带有梯度的张量的具体的值
问题:存在一个带有梯度的张量tensor_example,怎么读取它具体的值 方法:可以使用 .detach().cpu().numpy() 的组合。这样可以在保留值的同时,将张量从计算图中分离(detach)并移动到 CPU 上。 示例…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...