一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现
目录
前言:
一、密码加密
1. MD5介绍
2.彩虹表攻击
3.测试复杂密码是否能被攻破
二、加盐算法
1.对密码123456演示加盐算法
2.盐值的储存
3.密码加盐思想总结
三、Java代码实现
前言:
早些年,数据泄露屡见不鲜,每个班上总有一两个人qq被盗然后群发信息...这是因为,在以前,我们的密码在数据库里都是明文储存。
以前黑客看到的:账号:123456 密码:123456
黑客:
![]()
而现在,我们的密码在数据库里都是密文储存,黑客破解难度大大增加。
现在黑客看到的:账号:123456 密码:e10adc3949ba59abbe56e057f20f883e
一、密码加密
这一串复杂字符其实就是“123456”通过md5加密得到的。
md5加密网站
1. MD5介绍
MD5是一种摘要算法, 摘要算法是一种将任意长度的输入数据转换为固定长度的哈希值的算法。这个哈希值可以视为输入数据的“指纹”,因为它能够唯一地表示原始数据。
主要特点包括:
固定长度输出:无论输入数据的长度是多少,摘要算法都会生成一个固定长度的哈希值。比如,MD5 总是生成 128 位(16 字节)的哈希值,而 SHA-256 总是生成 256 位(32 字节)的哈希值。
不可逆性:摘要算法是单向的,意味着从生成的哈希值无法反向推导出原始数据。
高敏感性:即使输入数据的改变非常微小(比如仅改变一个字符),生成的哈希值也会有很大的不同。
抗碰撞性:不同的输入数据不应生成相同的哈希值。然而,在理论上可能存在哈希碰撞(即两个不同的输入数据生成相同的哈希值),但好的摘要算法会使这种碰撞非常难以发生。
2.彩虹表攻击
黑客无法直接从e10adc3949ba59abbe56e057f20f883e看出或计算出这个是“123456”。
最怕黑客动脑子...
黑客可以猜你的密码可能是123456,看看出来的值是否与e10adc3949ba59abbe56e057f20f883e相等。如果相等就说明密码是123456。
md5解密网站
事实上,不用手动阀一个一个去猜那么麻烦,有些网站输入密文能破解出。
而这个破解并不是真的可以从密文里看出明文,而是背后维护了一个密文明文表。已经有前人通过枚举的方式,把常见密码的md5都收集起来了,这样子的话就能快速找到对应的原始密码。这个也叫做彩虹表攻击。
彩虹表攻击是一种利用预计算哈希值来破解密码的技术。它通过建立一个包含常见密码及其对应哈希值的巨大数据库,允许攻击者快速查找某个哈希值对应的原始密码,而无需逐一尝试所有可能的密码。但彩虹表攻击只适用于简单密码。
彩虹表攻击的原理
哈希函数:通常密码存储时,系统不会直接保存明文密码,而是保存密码的哈希值。这些哈希值是通过哈希函数(如 SHA-256)计算出来的,哈希函数具有不可逆性,即很难从哈希值反推出原始密码。
预计算:彩虹表是一种预计算哈希值的表,表中包含了大量可能的明文密码及其对应的哈希值。攻击者可以在获得某个密码的哈希值后,直接在彩虹表中查找相应的明文密码,而无需计算大量哈希值。
查找匹配:一旦找到匹配的哈希值,攻击者就能够知道原始密码,从而破解密码。
这也就是为什么我们在一些应用上设置密码时,会要求我们密码增加难度,大小写加数字,这就是增加盲猜到密码的难度。
3.测试复杂密码是否能被攻破
现在我们随机拿一串复杂密码的md5,看看网站能不能解密...
加密过程:
尝试解密:
解密失败。
这也是为什么,我们在找回密码这个操作时,都是重置密码,而不是告诉你之前的密码是什么,因为它们也不知道...
这样子显然针对复杂密码很有效,但当这个密码是6位数的银行卡密码呢?
6位密码穷举只有9^6=531,441种可能,如果只用md5作为加密算法,维护一个密码表是很容易的,因此密码就很容易被破解。
二、加盐算法
所以我们要把简单密码->复杂密码,就很难破解,这里就要引入加盐算法

而我们需要加在简单密码上加上一些 “盐”使之变成复杂字符串。
为什么叫加盐是因为菜谱上的适量盐,适量到底是多少!!没人知道,只有写菜谱的人才知道
1.对密码123456演示加盐算法
这里我们采用 复杂密码 = 复杂字符串(盐值)+原始密码
123456 -> odaFEoisRjdDFjfio64854FDF!.F123456
而如果每一个密码都采用统一的盐值,就等于白给,还是可以通过穷举算出来所有的6位密码。因此,要给每一个密码都配上单独的盐值。
验证密码的比对过程:
最后比对两个红色部分是否相等来判断密码是否正确。
橙色是数据库中要储存的值。
2.盐值的储存
每个用户的盐值也需要储存在数据库里,如果单独弄一列来储存,还是不够隐秘。所以我们采用盐值与 md5(盐值+注册密码)拼接的形式。
举个例子:
蓝色部分是要存在数据库的字符串,解密时需要用到的两个字段。
拼接在一起存储:(怎么拼的?让别人猜去吧)
如图,拼接方式有很多,安全性大大提高。
只有知道是怎么拼接的,才能从这个字段中提取出来需要的 盐值 和 md(盐值+密码) 两个字符串。只有写代码的人才知道是怎么拼接的。
3.密码加盐思想总结
1.生成随机盐值:每次为新密码生成一个独特的、随机的盐值,确保不同密码的哈希值不会因为相同的输入密码而相同。
2.盐值与密码组合:将生成的盐值与用户的密码组合在一起,然后对组合后的字符串进行哈希运算。
3.存储哈希值和盐值:在数据库中巧妙存储最终的哈希值和对应的盐值,而不存储明文密码。每次验证密码时,使用相同的盐值进行哈希计算并与存储的哈希值进行比较。
4.增加破解难度:加盐有效防御了彩虹表攻击等基于预计算哈希值的攻击,因为即使攻击者拥有彩虹表,也无法直接查找原始密码的哈希值,因为盐值的随机性使得每个哈希值都是独一无二的。
三、Java代码实现
需求分析:
1.生成盐值
2.加密:用盐值对给定密码进行加密得到哈希
3.解密:给定盐值和哈希,看是否能通过校验
导包:
import org.springframework.util.DigestUtils;// 用于生成 MD5 哈希值
import org.springframework.util.StringUtils;// 用于字符串处理的工具类,检查字符串是否为空
import java.util.UUID;// 用于生成全局唯一标识符(UUID)以生成随机盐值
生成盐值和加密:
public static String encrypt(String inputPassword) {//生成随机盐值String salt= UUID.randomUUID().toString().replace("-","");//md5(明文+盐值)String finalPassword = DigestUtils.md5DigestAsHex((inputPassword+salt).getBytes());//返回最后数据库中存储的哈希(我这里采用的时盐值+md5(明文+盐值))return salt + finalPassword;}
校验方法:
public static boolean verify(String inputPassword,String sqlPassword) {//校验参数是否合法if(!StringUtils.hasLength(inputPassword)){return false;}if (sqlPassword==null || sqlPassword.length()!=64){return false;}//获取盐值String salt=sqlPassword.substring(0,32);//[0,31)//计算密文String calFinalPassword = DigestUtils.md5DigestAsHex((inputPassword+salt).getBytes());//看是否对应return (salt+calFinalPassword).equals(sqlPassword);}
相关文章:
一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现
目录 前言: 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言: 早些年,数据泄露屡见不鲜,每个班上总…...
C++入门2
函数重载 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…...
在Nestjs使用mysql和typeorm
1. 创建项目 nest new nest-mysql-test 2. 添加config 安装 nestjs/config 包 pnpm i --save nestjs/config 添加 .env 文件 DATABASE_HOSTlocalhost DATABASE_PORT3306 DATABASE_USERNAMEroot DATABASE_PASSWORD123456 DATABASE_DBdbtest 创建 config/database.config.…...
【数据库】MySql深度分页SQL查询优化
问题描述 mysql中,使用limitoffset实现分页难免会遇到深度分页问题,即页码数越大,性能越差。 select * from student order by id limit 200000,10;如上语句,其实我们希望查询第20000页的10条数据,实际执行会发现耗时…...
黑马Java零基础视频教程精华部分_14_正则表达式
系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法:2、验证手机号3、验证座机电…...
20240812 每日AI必读资讯
黑匣子被打开了!能玩的Transformer可视化解释工具:Transformer Explainer - 佐治亚理工学院和 IBM 研究院开发一款基于 web 的开源交互式可视化工具「Transformer Explainer」,帮助非专业人士了解 Transformer 的高级模型结构和低级数学运算…...
C++ 项目中的类框架
/* * 类调用框架 */ /* CameraApp.h */ class CameraApp { public: CameraApp(); ~CameraApp(); int Init(void); int UnInit(void); public: XnetNode m_xnode_thd; XcamServer m_xcam_thd; }; /* CameraApp.cpp */ CameraApp::CameraApp(): m_…...
【Python随笔】比PyQt5更先进的pyside6安装和使用方法
最近因为自研日常开发工具的需求,决定重新拾起PyQt5之类的桌面工具开发技术栈,为啥选用PyQt,一是因为笔者比较精通python,二是因为不需要在外观上做什么特别的东西。经过一番调研,发现当前的PyQt5版本已经过时…...
如何给 VMware Workstation 虚拟机配置代理
文章目录 步骤一:检查虚拟机网络设置步骤二:获取代理服务器 IP 地址步骤三:配置虚拟机的代理设置步骤四:验证代理配置总结 在使用 VMware Workstation 虚拟机时,有时候我们需要通过代理服务器访问外部网络资源。本文将…...
前端路由VueRouter总结
简介: Vue路由vue-router是官方的路由插件,能够轻松的管理 SPA 项目中组件的切换。Vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来vue-router 目前有 3.x 的版本和 4.x 的版本,vue-…...
基于SpringBoot+Vue的铁路订票管理系统(带1w+文档)
基于SpringBootVue的铁路订票管理系统(带1w文档) 基于SpringBootVue的铁路订票管理系统(带1w文档) 铁路订票管理工作向来都是社会上不可或缺的一部分,然而多年以来人们大都习惯使用传统方法,即人工来完成铁路订票的管理,但是这种方法存在着工…...
Firefox滚动条在Win10和Win11下表现不一致问题?
文章目录 前言总结解决方法 前言 最近在写页面的时候发现一个非常有意思的事。Firefox滚动条在Win10和Win11下表现居然不一致。在网上几经查找资料, 终于找到原因所在。总结成下面的文章,加深印象也防止下次遇到。 总结 参考文章: Firefox…...
vue3 组件传参
import {reactive,defineProps,onMounted,ref} from vue const props defineProps({ projectInfo: { type: Object, default: () > { return {}; } } }); console.log("🚀 ~ 审核详情项目概述:", props.projectInfo) <Detail v-if"isReady…...
unity自动添加头部注释脚本
unity自动添加头部注释脚本,放在Assets目录自动生效 public class ScriptCreateInit : UnityEditor.AssetModificationProcessor {private static void OnWillCreateAsset(string path){path path.Replace(".meta", "");if (path.EndsWith(&qu…...
Raw格式化后文件能恢复吗 电脑磁盘格式化后如何恢复数据 硬盘格式变成了raw怎么恢复
硬盘、U盘等移动存储设备在存储数据文件上是非常方便的,不过在使用过程中也会因为操作、或者本身设备问题,导致存储设备出现各种各样的问题。较为常见的问题就是存储设备格式化、存储设备格式变为Raw格式等。今天要给大家分享的是有关Raw格式化的相关内容…...
Android targetSdkVersion改成33遇到的坑
targetSdkVersion 改成 33 ,遇到一些坑。 需要注意的地方: 修改 targetSdkVersion 为 33。AndroidManifest.xml 里添加 android:exported“true”升级 Gradle 版本。升级第三方库。 修改 app 的 build.gradle , android {compileSdkVersi…...
1985-2023年中国城市统计年鉴(PDF+EXCEL)
1985-2023年中国城市统计年鉴 1、时间:1985-2023年 2、格式:1985-2023年PDF版本,1993-2023年excel格式 3、说明:中国城市统计年鉴收录了全国各级城市社会经济发展等方面的主要统计数据,数据来源于各城市的相关部门。…...
从AI小白到大神的7个细节:让你开窍逆袭
在当今科技界,人工智能无疑是最炙手可热的话题。然而,这个领域充斥着专业术语,使得理解每次技术革新的具体内容变得颇具挑战性。 为了帮助读者更好地把握时代脉搏,本文整理了一系列常见的人工智能(AI)术语…...
AIxBoard部署BLIP模型进行图文问答
一、AIxBoard简介 AIxBoard(X板)是一款IA架构的人工智能嵌入式开发板,体积小巧功能强大,可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机…...
小白零基础学数学建模应用系列(一):探索自由下落模型——以“坠落的硬币”为例
在数学建模竞赛中,选择一个易于理解且有趣的物理现象作为研究对象,往往能够使模型的构建和分析更具吸引力和说服力。本篇文章将以“坠落的硬币”这一经典的自由下落问题为例,探讨如何通过建立物理模型来验证或推翻常见的物理误解,…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...






最后比对两个红色部分是否相等来判断密码是否正确。