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

【MD5】密码加密之加盐算法

哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ  


本期主要是给大家分析一下,  密码的如果加密存储的,  学习加盐算法的思想,  通过一个简单的案例, 即可快速学习.  一起来看看叭~


适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “Java知识”。

 

更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘ 


一、MD5 简介

MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,能够将任意长度的数据映射为固定长度的128位(16字节)哈希值。MD5常用于数据完整性校验和密码存储,但是 MD5 已经被破解了, 在安全性上就会大打折扣, 本篇主要学习加盐算法的思想,  后续也可以采用更为安全的加密算法(使用更强的哈希算法,如SHA-256或SHA-3),  针对数据加密的思想是一致的.

主要特点:

  1. 固定长度输出:无论输入数据的大小如何,MD5输出的哈希值始终为128位。
  2. 快速计算:MD5计算速度较快,适合处理大量数据。
  3. 碰撞问题:MD5容易出现碰撞,即不同的输入数据可能生成相同的哈希值,因此不适合用于需要高安全性的场合。
  4. 广泛应用:尽管不再安全,MD5仍在一些非安全敏感的场合使用,例如文件完整性校验。

虽然MD5的加密过程较为复杂,但总体上是通过一些步骤将任意长度的输入数据映射为固定长度的哈希值。由于其碰撞性问题,以及算法早已被破解, MD5在安全领域的应用逐渐被淘汰。

 本次采用 Jave 语言, 来给大家阐述算法思想.


二、加盐算法

“加盐”是一种用于增强密码存储安全性的技术,它通过在密码中添加额外的随机数据(即“盐”)来使密码的哈希值更加独特和安全。

加盐算法的步骤

  1. 生成盐值

    为每个用户生成一个随机的盐值(通常是一个固定长度的随机字符串,可以使用UUID)。这个盐值应该是唯一的,并且对于每个用户都不同。
  2. 组合密码和盐

    将用户输入的密码进行哈希加密后的值 + 生成的盐值结合。
  3. 二次哈希处理

    使用安全的哈希函数(如SHA-256、bcrypt、Argon2等)或 MD5 对组合后的字符串二次哈希处理,生成新的一个哈希值。
  4. 存储

    将盐值(随机值)和哈希值(密码)一起存储在数据库中。通常,盐值和哈希值会在同一行中保存。后续可以通过 (哈希加密(用户输入的密码) + 盐值) 进行二次哈希,  然后与数据库中的哈希值进行对比, 相同即可判断当前密码是正确的, 不同则反之, 所以这个盐值是比较重要的.

废话不多说, 直接上代码演示(MD5):

Java 中使用 MD5 加密, 需要在 pom.xml 文件 引入第三方工具包:

<!-- 编码解码加密⼯具包 MD5 加密--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency>

第一步:

创建一个 User 类, 来模拟数据库 User 表(在项目中, 也会使用一个类来描述数据库表)

/*** Created with IntelliJ IDEA.* Description: 采用当前类, 模拟数据库用户表* Author: 保护小周* Date: 2024-10-30* Time: 0:37*/
public class User {private String nickname; // 昵称private String username; // 用户名private String password; // 密码private String salt; // 盐值public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSalt() {return salt;}public void setSalt(String salt) {this.salt = salt;}@Overridepublic String toString() {return "User{" +"nickname='" + nickname + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +", salt='" + salt + '\'' +'}';}
}

第二步: 

要保持工具类之间的低耦合~ , 所以业务类传参即可.

封装工具类 MD5 

import org.apache.commons.codec.digest.DigestUtils;
/*** Created with IntelliJ IDEA.* Description: MD5 加密的工具类* Author: 保护小周* Date: 2024-10-29* Time: 23:48*/
public class MD5Util {/*** 传入原字符串可以得到 md5 加密的密文* @param str 明文* @return 密文*/public static String md5(String str) {return DigestUtils.md5Hex(str);}/*** 原密码进行 md5 加密 = 密文1* 密文1 + 拢动字符(盐值) = 密文2* 对密文 2 进行 md5 加密* @param str 明文* @param salt 盐值 (随机值)* @return 密文*/public static String md5Salt(String str, String salt) {return md5(md5(str) + salt);}
}

 封装工具类 UUID, 生成盐值

import java.util.UUID;/*** Created with IntelliJ IDEA.* Description:* Author: 保护小周* Date: 2023-08-07* Time: 17:26*/
public class UUIDUtil {/*** 生成一个 UUID (36位)* @return*/public static String uuid_36 () {return UUID.randomUUID().toString();}/*** 生成一个 UUID (32位), 去除 - * @return*/public static String uuid_32 () {return UUID.randomUUID().toString().replace("-","");}
}

第三步: 模拟新增用户, 登录用户

import java.util.HashMap;
import java.util.Map;/*** Created with IntelliJ IDEA.* Description:* Author: 保护小周* Date: 2024-10-30* Time: 0:47*/
public class Dome {// 模拟数据库存储 每一个 user 用户public static Map<String, User> userMap = new HashMap<String, User>();/*** 新用户注册* @param nickname* @param username* @param password* @return*/private static Boolean register(String nickname, String username, String password) {// 1. 密码 进行 MD5 + 加盐算法 加密/*  加密方式:*  原密码进行 md5 加密 = 密文1*  密文1 + 拢动字符(盐值) = 密文2*  对密文 2 进行 md5 加密*/// 1.1  盐值, 通过封装的 UUID工具类 随机生成String salt = UUIDUtil.uuid_32();// 1.2 通过封装的 MD5 工具类方法, 一步到位String md5Password = MD5Util.md5Salt(password, salt);System.out.println("注册密码加密后: " + md5Password);// 2. 存入 "数据库" userMap, key = username,  value = userUser user = new User();user.setNickname(nickname);user.setUsername(username);user.setPassword(md5Password); // 密码存储的是加密后的密文user.setSalt(salt); // 存储盐值, 以便于后续比较密码是否正确// 入库userMap.put(user.getUsername(), user);System.out.println(user);return true;}/*** 模拟用户登录* @param username* @param password* @return*/private static Boolean login(String username, String password) {// 1. 用户输入用户名及其密码, 数据来源于前端登录请求// 1.2 判断用户名是否已经注册, 根据用户名, 从 "数据库" 中获取User user = userMap.get(username);if (user == null) {System.out.println("用户名密码错误!"); // 前端反馈 , 用户不存在return false;}// 1.3 用户存在, 再判断密码是否正确// 对 password 进行 md5 加密得到 密码1 , 密码1 与 salt(盐值) 进行加密, 得到密码 2// salt , 是我们注册的时候记录在数据库中 user 的 salt 属性(也就是我们查询出的 user里面)String saltPassword = MD5Util.md5Salt(password, user.getSalt());// 因为, MD5值 是通过映射来产生的结果, 所以相同的密码, 产生的也是相同的密文System.out.println("登录密码进行加密后: " + saltPassword);return saltPassword.equals(user.getPassword());}public static void main(String[] args) {// 1. 创建新用户, 数据来源于前端的注册页面String nickname = "张三";String username = "1867134****";String password = "123456";// 2. 模拟注册新用户boolean ok = register(nickname, username, password);if (ok) {System.out.println(username + ": 注册成功! ");}// 3. 模拟用户登录, 数据来源于前端String loginUsername = "1867134****";String loginPassword = "123456";ok = login(username, password);if (ok) {System.out.println(username + ": 用户登录成功");}}
}

运行结果展示: 


好了,到这里,【MD5】密码加密之加盐算法 博主已经分享完了,通过一个简单的案例描述,  学习密码加盐的思想,   阐述较为基础,  希望对大家有所帮助,如有不妥之处欢迎批评指正。 

感谢每一位观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

相关文章:

【MD5】密码加密之加盐算法

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 本期主要是给大家分析一下, 密码的如果加密存储的, 学习加盐算法的思想, 通过一个简单的案例, 即可快速学习. 一起来看看叭~ 适用于编程初学者&#xff0c;感兴趣的朋友们可以订阅&…...

服务器虚拟化

前言 服务器虚拟化是一种技术&#xff0c;它通过将一台物理服务器的软件环境分割成多个独立分区&#xff0c;使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能&#xff0c;提高运营效率&#xff0c;节约能源并降低经济成本。 通过…...

贪心算法理论基础和习题【算法学习day.17】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

爬虫ip技术未来发展趋势

各位朋友&#xff0c;大家好&#xff01;有伙伴问爬虫技术未来会有更好的发展么&#xff0c;那今天小蝌蚪来跟大家聊聊爬虫技术未来的发展趋势分享一下行业咨询。 大家在日常工作和生活中&#xff0c;都希望事情能更省心、高效吧&#xff1f;未来的爬虫技术就朝着这个方向发展…...

推荐一款功能强大的文字处理工具:Atlantis Word Processor

Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档&#xff0c;并且软件的界面能够按用户的意愿去自定义&#xff0c;比如工具栏、字体选择、排版、打印栏等等&#xff0c;当然还有更多的功能&#xff0c;比如你还可以吧软件界面中的任何…...

语言≠思维,大模型学不了推理:一篇Nature让AI社区炸锅了

转自&#xff1a;机器之心 大语言模型&#xff08;LLM&#xff09;为什么空间智能不足&#xff0c;GPT-4 为什么用语言以外的数据训练&#xff0c;就能变得更聪明&#xff1f;现在这些问题有 「标准答案」了。 近日&#xff0c;一篇麻省理工学院&#xff08;MIT&#xff09;等…...

Ubuntu 安装 npm

1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装&#xff01;...

Go:package

文章目录 标准库概述regexp包锁和sync包自定义包和可见性基本格式导入外部安装包包的初始化 自定义包使用godoc自定义包的目录结构 标准库概述 在之前的部分已经用了很多和标准库有关的内容&#xff0c;比如有fmt&#xff0c;os这种功能 unsafe: 包含了一些打破 Go 语言“类型…...

大数据之微服务注册、发现与熔断方案

大数据微服务注册、发现与熔断方案 介绍实现框架利用Spring Cloud实现微服务注册&#xff0c;发现&#xff0c;熔断实例&#xff1f; 一&#xff0c;介绍 大数据微服务注册、发现与熔断是微服务架构中的关键概念&#xff0c;它们各自在微服务架构中扮演着重要的角色。以下是对这…...

最新出炉!2024年邮件营销平台综合盘点

随着数字化营销的不断发展&#xff0c;邮件营销依然是企业与客户保持联系的重要渠道之一。2024年&#xff0c;邮件营销平台市场竞争激烈&#xff0c;各大平台纷纷推出新功能&#xff0c;以满足企业日益增长的需求。在众多平台中&#xff0c;Zoho Campaigns作为一款成熟的邮件营…...

Qgis 开发初级 《ToolBox》

Qgis 有个ToolBox 的&#xff0c;在Processing->ToolBox 菜单里面&#xff0c;界面如下。 理论上Qgis这里面的工具都是可以用脚本或者C 代码调用的。界面以Vector overlay 为例子简单介绍下使用方式。Vector overlay 的意思是矢量叠置分析&#xff0c;和arcgis软件类似的。点…...

Apache HttpClient 和 OkHttpClient 的使用

概述 Apache HttpClient Apache HttpClient是一个开源的HTTP客户端库&#xff0c;提供了丰富的HTTP通信功能。它支持HTTP/1.1和HTTPS协议&#xff0c;具有连接池管理、重试机制、代理设置等高级特性。HttpClient的API设计虽然相对繁琐&#xff0c;但提供了高度的可配置性和灵…...

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引&#xff1f; 全文索引通过分析和处理文本&#xff0c;将文档中的单词分解为词条&#xff08;tokens&#xff09;&#xff0c;然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录&#xff0c;而不必对所有文本逐字匹配。 二…...

GoogleChrome和Edge浏览器闪屏问题

GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…...

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中&#xff0c;这样…...

Go性能基础

本篇内容是根据2020年2月份#117 Foundations of Go performance音频录制内容的整理与翻译 在这个多部分系列的第一部分中&#xff0c;Ian 和 Johnny 以及 Miriah Peterson 和 Bryan Boreham 一起揭开了 Go 程序性能的第一层重要内容。 过程中为符合中文惯用表达有适当删改, 版…...

银河麒麟v10安装Anaconda(python大蟒蛇)+pycharm安装

Anaconda中文是大蟒蛇&#xff0c;是一个用于科学计算的Python发行版&#xff0c;预装大量的模块包&#xff0c;不需要单独下载python进行安装 1安装环境 1.1系统版本 操作系统版本&#xff1a;银河麒麟桌面版操作系统v10(SP1) 版本号&#xff1a;2303 架构&#xff1a;x86…...

集群聊天服务器——逻辑梳理

网络聊天服务器项目&#xff0c;该项目分为4个模块&#xff1a; 首先是网络模块&#xff1a;我使用了muduo高性能网络库&#xff0c;解耦合网络与业务之间这两部分代码&#xff0c;可以更加专注与业务的功能开发其次是服务层模块&#xff1a;我使用了基于C11的技术比如绑定器和…...

10 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒24_10_30

这里写目录标题 cpp 101 最长回文子串1.1 题目1.2 思路1.3 程序实现 2 买卖股票的最好时机(一)2.1 题目2.2 思路2.3 程序实现2.4 程序实现 – 优化 3 [NOIP2002 普及组] 过河卒3.1题目3.2 思路3.3程序实现 – dp 4 题目链接 cpp 10 1 最长回文子串 1.1 题目 1.2 思路 读完了…...

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中&#xff0c;Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用&#xff0c;尤其是在高并发和UI性能优化中&#xff0c;可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...