加盐加密算法保护用户密码 实战案例 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

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文