加盐加密算法保护用户密码 实战案例 PasswordUtil

本文主要是介绍加盐加密算法保护用户密码 实战案例 PasswordUtil,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

加盐算法(Salted Hashing)是一种密码学技术,用于增强密码的安全性。它结合了哈希算法和随机盐值的概念在传统的密码存储中,用户的密码通常是经过哈希算法处理后存储在数据库中。然而,这种方法面临着彩虹表和字典攻击等风险。

  • 彩虹表是一个预先计算好的表格,其中包含了大量的输入和对应的哈希值。攻击者可以使用彩虹表反向查找通过已知的哈希值来快速找到对应的原始密码。
  • 字典攻击是一种暴力破解技术,假设用户的密码是常见的词语、短语或常用密码的组合。攻击者使用一个包含大量常见密码、常用词语、姓名、日期等的字典文件,将其中的每个密码依次尝试,与目标账户的密码进行比对。

为了防止这些攻击,加盐算法引入了"盐”,即一个随机的、唯一的字符串。在存储用户密码时,将密码与盐值进行组合,再使用哈希算法进行处理,得到一个唯一的哈希值。这样,即使两个用户使用相同的密码,由于使用了不同的盐值,其哈希值也会不同。另外,盐值通常是不保存在数据库中的,而是与哈希值一起存储。这样,即使攻击者获取到数据库,也很难破解密码。
总体来说,加盐算法通过使用随机的盐值和哈希算法,使得相同的密码拥有不同的哈希值,增加了密码的安全性提高了用户的率码保护级别。

package com.example.common;import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;import java.util.UUID;public class PasswordUtil {/*** 加盐算法 -> 格式:盐值(32)$加密之后的密码(32)* @param password 原密码* @return*/public static String encrypt(String password){// 1.生成盐值String salt = UUID.randomUUID().toString().replace("-","");// 2.使用加密算法将盐值+原密码进行加密String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());// 3.将盐值和加密后的密码一起返回String dbPassword = salt+"$"+finalPassword;return dbPassword;}/*** 密码验证* @param inputPassword* @param dbPassword* @return*/public static boolean decrypt(String inputPassword,String dbPassword){// 1.验证参数if(!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(dbPassword) ||dbPassword.length()!=65 || !dbPassword.contains("$")){return false;}// 2.将用户输入的密码和数据库的盐值进行加密,得到待验证的加密密码// 2.1 得到盐值 & 最终正确的密码String[] dbPasswordArray = dbPassword.split("\\$");String salt = dbPasswordArray[0];String finalPassword = dbPasswordArray[1];// 2.2 使用数据库的盐值+用户输入的密码进行加密=待验证的加密密码String userPassword = DigestUtils.md5DigestAsHex((salt+inputPassword).getBytes());// 3.将待验证密的加密密码和数据的加密的密码进行对比if(userPassword.equals(finalPassword)){return true;}// 4.将结果返回给调用方return false;}
}

这篇关于加盐加密算法保护用户密码 实战案例 PasswordUtil的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057984

相关文章

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地