当前位置: 首页 > news >正文

一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现

目录

前言:

一、密码加密

  1. MD5介绍 

2.彩虹表攻击

3.测试复杂密码是否能被攻破

二、加盐算法

1.对密码123456演示加盐算法

2.盐值的储存

3.密码加盐思想总结

三、Java代码实现


前言:

      早些年,数据泄露屡见不鲜,每个班上总有一两个人qq被盗然后群发信息...这是因为,在以前,我们的密码在数据库里都是明文储存。

   以前黑客看到的:账号:123456 密码:123456

            黑客: 

          而现在,我们的密码在数据库里都是密文储存,黑客破解难度大大增加。

现在黑客看到的:账号:123456 密码:e10adc3949ba59abbe56e057f20f883e


一、密码加密

这一串复杂字符其实就是“123456”通过md5加密得到的。

md5加密网站

  1. MD5介绍 

     MD5是一种摘要算法, 摘要算法是一种将任意长度的输入数据转换为固定长度的哈希值的算法。这个哈希值可以视为输入数据的“指纹”,因为它能够唯一地表示原始数据。

主要特点包括:

  1. 固定长度输出:无论输入数据的长度是多少,摘要算法都会生成一个固定长度的哈希值。比如,MD5 总是生成 128 位(16 字节)的哈希值,而 SHA-256 总是生成 256 位(32 字节)的哈希值。

  2. 不可逆性摘要算法是单向的,意味着从生成的哈希值无法反向推导出原始数据。

  3. 高敏感性:即使输入数据的改变非常微小(比如仅改变一个字符),生成的哈希值也会有很大的不同。

  4. 抗碰撞性:不同的输入数据不应生成相同的哈希值。然而,在理论上可能存在哈希碰撞(即两个不同的输入数据生成相同的哈希值),但好的摘要算法会使这种碰撞非常难以发生。 


2.彩虹表攻击

     黑客无法直接从e10adc3949ba59abbe56e057f20f883e看出或计算出这个是“123456”。

     最怕黑客动脑子...

     黑客可以猜你的密码可能是123456,看看出来的值是否与e10adc3949ba59abbe56e057f20f883e相等。如果相等就说明密码是123456。

md5解密网站

事实上,不用手动阀一个一个去猜那么麻烦,有些网站输入密文能破解出。

        而这个破解并不是真的可以从密文里看出明文,而是背后维护了一个密文明文表。已经有前人通过枚举的方式,把常见密码的md5都收集起来了,这样子的话就能快速找到对应的原始密码。这个也叫做彩虹表攻击。

     彩虹表攻击是一种利用预计算哈希值来破解密码的技术。它通过建立一个包含常见密码及其对应哈希值的巨大数据库,允许攻击者快速查找某个哈希值对应的原始密码,而无需逐一尝试所有可能的密码。但彩虹表攻击只适用于简单密码。

彩虹表攻击的原理

  1. 哈希函数:通常密码存储时,系统不会直接保存明文密码,而是保存密码的哈希值。这些哈希值是通过哈希函数(如 SHA-256)计算出来的,哈希函数具有不可逆性,即很难从哈希值反推出原始密码。

  2. 预计算:彩虹表是一种预计算哈希值的表,表中包含了大量可能的明文密码及其对应的哈希值。攻击者可以在获得某个密码的哈希值后,直接在彩虹表中查找相应的明文密码,而无需计算大量哈希值。

  3. 查找匹配:一旦找到匹配的哈希值,攻击者就能够知道原始密码,从而破解密码。

      这也就是为什么我们在一些应用上设置密码时,会要求我们密码增加难度,大小写加数字,这就是增加盲猜到密码的难度。


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版本已经过时&#xf…...

如何给 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("&#x1f680; ~ 审核详情项目概述:", props.projectInfo) <Detail v-if"isReady…...

unity自动添加头部注释脚本

unity自动添加头部注释脚本&#xff0c;放在Assets目录自动生效 public class ScriptCreateInit : UnityEditor.AssetModificationProcessor {private static void OnWillCreateAsset(string path){path path.Replace(".meta", "");if (path.EndsWith(&qu…...

Raw格式化后文件能恢复吗 电脑磁盘格式化后如何恢复数据 硬盘格式变成了raw怎么恢复

硬盘、U盘等移动存储设备在存储数据文件上是非常方便的&#xff0c;不过在使用过程中也会因为操作、或者本身设备问题&#xff0c;导致存储设备出现各种各样的问题。较为常见的问题就是存储设备格式化、存储设备格式变为Raw格式等。今天要给大家分享的是有关Raw格式化的相关内容…...

Android targetSdkVersion改成33遇到的坑

targetSdkVersion 改成 33 &#xff0c;遇到一些坑。 需要注意的地方&#xff1a; 修改 targetSdkVersion 为 33。AndroidManifest.xml 里添加 android:exported“true”升级 Gradle 版本。升级第三方库。 修改 app 的 build.gradle &#xff0c; android {compileSdkVersi…...

1985-2023年中国城市统计年鉴(PDF+EXCEL)

1985-2023年中国城市统计年鉴 1、时间&#xff1a;1985-2023年 2、格式&#xff1a;1985-2023年PDF版本&#xff0c;1993-2023年excel格式 3、说明&#xff1a;中国城市统计年鉴收录了全国各级城市社会经济发展等方面的主要统计数据&#xff0c;数据来源于各城市的相关部门。…...

从AI小白到大神的7个细节:让你开窍逆袭

在当今科技界&#xff0c;人工智能无疑是最炙手可热的话题。然而&#xff0c;这个领域充斥着专业术语&#xff0c;使得理解每次技术革新的具体内容变得颇具挑战性。 为了帮助读者更好地把握时代脉搏&#xff0c;本文整理了一系列常见的人工智能&#xff08;AI&#xff09;术语…...

AIxBoard部署BLIP模型进行图文问答

一、AIxBoard简介 AIxBoard&#xff08;X板&#xff09;是一款IA架构的人工智能嵌入式开发板&#xff0c;体积小巧功能强大&#xff0c;可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机&#xf…...

小白零基础学数学建模应用系列(一):探索自由下落模型——以“坠落的硬币”为例

在数学建模竞赛中&#xff0c;选择一个易于理解且有趣的物理现象作为研究对象&#xff0c;往往能够使模型的构建和分析更具吸引力和说服力。本篇文章将以“坠落的硬币”这一经典的自由下落问题为例&#xff0c;探讨如何通过建立物理模型来验证或推翻常见的物理误解&#xff0c;…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...

LeetCode 0386.字典序排数:细心总结条件

【LetMeFly】386.字典序排数&#xff1a;细心总结条件 力扣题目链接&#xff1a;https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n &#xff0c;按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...