如何实现加盐加密

news2024/12/24 0:25:19

自己实现 

传统MD5可通过彩虹表暴力破解, 

加盐加密算法是一种常用的密码保护方法,它将一个随机字符串(盐)添加到原始密码中,然后再进行加密处理。

  • 1. 每次调用方法产生一个唯一盐值(UUID )+密码=最终密码。
  • 解密:需要验证的密码(用户输入的密码),最终加密的密码(存在于数据库)得到盐值,盐值存在最终密码的某个位置,——>盐值{32位}$最终密码{32位};
  •  2. 对组合后的字符串进行多次哈希计算,每次哈希时都使用盐值和先前的哈希值。哈希计算的次数由工作因子控制。

验证密码
已有:用户输入的明文密码、此用户在数据库存储的最终密码=[盐值$加密后的密码]
32位32位
1.从最终密码中得到盐值
2.将用户输入的明文密码+盐值进行加密操作=加密后的密码3.使用盐值+分隔符+加密后的密码生成数据库存储的密码
4.对比生成的最终密码和数据库最终的密码是否相等如果相等,那么用户名和密码就是对的,反之则是密码输入错误。 

package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class PasswordUtils {
    //1.加盐生成密码

    public static String encrypt(String password){
        //盐32位
        String salt= UUID.randomUUID().toString().replace("-","");
        String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        String finalPassword=salt+"$"+saltPassword;
        return finalPassword;
    }
    //2.生成加盐密码
    public static String encrypt(String password,String salt){
        String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());

        String finalPassword=salt+"$"+saltPassword;
        return finalPassword;
    }

    /**验证密码
     *
     * @param :用户输入的明文密码
     * @param :数据库保存的最终密码
     * @return
     */
    public static boolean check(String inputPassword , String finalPassword){
        if(StringUtils.hasLength(inputPassword)&&StringUtils.hasLength(finalPassword)&&finalPassword.length()==65){
            String salt=finalPassword.split("\\$")[0];
             String confirmPssword=PasswordUtils.encrypt(inputPassword,salt);
             return confirmPssword.equals(finalPassword);
        }
        return false;
    }

    public static void main(String[] args) {
        String password="123456";
        String finalPassword=encrypt(password);
        System.out.println(PasswordUtils.encrypt(password));

        String inputPassword="12345";
        String inputPassword2="123456";
        System.out.println("比对结果1:"+ check(inputPassword,finalPassword));
        System.out.println("比对结果2  :"+ check(inputPassword2,finalPassword));

        //check(inputPassword2,finalPassword);

    }
}

 

 Spring Security

是提供身份验证和授权的框架 ,可用于用户认证,访问控制,安全事件和日志记录等

还有就是Spring Security加盐

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

 这样甚至改了页面

当用这个认证密码授权成功后才会到我们的登录页面

所以我们要排除SpringSecurity自动加载 

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


@SpringBootTest()
class  Demo1ApplicationTests {

    @Test
    void contextLoads() {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password ="123456";

        // 第一次加密
        String finalPassword1 = passwordEncoder.encode(password);
        System.out.println("第1次加密:" + finalPassword1);

        // 第二次加密
        String finalPassword2 = passwordEncoder.encode(password);
        System.out.println("第2次加密:" + finalPassword2);

        // 第三次加密
        String finalPassword3 = passwordEncoder.encode(password);
        System.out.println("第3次加密:" + finalPassword3);

        // 验证密码
        String inputPassword = "12345";
        System.out.println("错误密码比对结果: " + (passwordEncoder.matches(inputPassword, finalPassword1)));

        String inputPassword2 = "123456";
        System.out.println("正确密码比对结果: " + (passwordEncoder.matches(inputPassword2, finalPassword1)));
    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海关查验到底查些什么,又有哪些注意事项呢?

“海关查验”是什么&#xff1f; 海关查验是指海关在接受报关单位的申报后&#xff0c;依法为确定进出境货物的性质、原产地、货物状况、数量和价值是否与货物申报单上已填报的详细内容相符&#xff0c;对货物进行实际检查的行政执法行为。查验是国家赋予海关的一种依法行政的…

显卡算力总结

2023年12月 显卡天梯图 FP32浮点性能 性能排行榜 | TopCPU.net2023年12月 最新的显卡天梯图和 FP32浮点性能 性能排行榜&#xff0c;包括浮点性能排名、测试得分和规格数据。跑分对比、基准测试比较。 https://www.topcpu.net/cpu-r5 显卡显存&#xff08;G&#xff09;浮点算…

电商用户行为可视化分析

1、导包 import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt import pyecharts.options as opts from pyecharts.charts import Line from pyecharts.charts import Grid 2、导数据 t_f_user pd.read_csv("tianchi_fresh…

提高企业邮箱安全性的策略与技巧

提高企业邮箱的安全性的方法大体相同&#xff0c;每家邮箱供应商也可能会有自己独有防护措施。 为了增强Zoho Mail企业邮箱的安全性&#xff0c;您可参考以下建议&#xff1a; 采用强密码&#xff1a;创建包含大写字母、小写字母、数字和特殊字符的复杂密码&#xff0c;并定期…

基于SSM的图书馆管理系统运行部署教程

基于SSM的图书馆管理系统运行部署教程 1、下载2、数据准备-导入sql文件3、项目导入idea4、项目运行5、测试6、日志乱码问题 1、下载 源码下载地址&#xff1a; https://download.csdn.net/download/weixin_44796239/85072348下载之后&#xff0c;会得到一个压缩包&#xff1a; …

Windows驱动中校验数字签名(使用 ci.dll)

1.背景 对于常规应用程序来说&#xff0c;校验数字签名认证在应用层可以使用 WinVerifyTrust, 在驱动层使用常规的 API无法使用&#xff0c;自己分析数据又太麻烦。 在内核中 ci.dll 包装了数据签名验证相关的功能&#xff0c;我们可以使用该 dll 来实现我们的数字签名验证。 详…

2023年度亚太客户中心产业发展论坛——鸿联九五荣获亚太区卓越客服大赛客户运营管理类铂金大奖

11月27-28日&#xff0c; 2023年度亚太客户中心产业发展论坛暨亚太区卓越客服大赛在马来西亚吉隆坡举行。来自中国、澳大利亚、马来西亚、新加坡、中国香港、印度尼西亚和泰国等多个国家及地区的优秀企业代表齐聚吉隆坡。 论坛首日活动以“Experience Excellence, Meet the Cha…

JavaScript代码压缩的功效与作用

JavaScript代码压缩可实现3大功能&#xff1a;减小体积、优化逻辑、提升执行效率 专业的JavaScript代码压缩&#xff0c;绝不仅仅是去除回车使代码挤到一行&#xff0c;而是用真正的技术减小代码体积、提升代码性能。 下面&#xff0c;以JShaman的JavaScript代码压缩功能为例…

辐射校正、辐射定标、大气校正关系

文章目录 前言一、基本概念二、辐射校正三、辐射定标四、大气校正 1.是否需要大气校正2.大气校正模型 五、参考链接 前言 完整的辐射校正包括遥感器校准、大气校正、太阳高度和地形校正。本文主要介绍辐射校正基本概念及区分辐射校正、辐射定标、大气校正。 一、基本概念 DN&a…

Java 将word转为PDF的三种方式和处理在服务器上下载后乱码的格式

我这边是因为业务需要将之前导出的word文档转换为PDF文件&#xff0c;然后页面预览下载这样的情况。之前导出word文档又不是我做的&#xff0c;所以为了不影响业务&#xff0c;只是将最后在输出流时转换成了PDF&#xff0c;当时本地调用没什么问题&#xff0c;一切正常&#xf…

挂耳式蓝牙耳机性价比排行榜吗,排名靠前的几款耳机推荐

当涉及挂耳式蓝牙耳机的选择时&#xff0c;消费者常常陷入选择困境&#xff0c;面对市场上琳琅满目的产品&#xff0c;很难找到性价比兼具的理想之选&#xff0c;为了帮助大家在众多选择中快速定位高性价比的耳机&#xff0c;我们精心整理了一份挂耳式蓝牙耳机性价比排行榜&…

javaWebssh图书系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

系统前景 图书有很多&#xff0c;老的图书书的管理靠纸介质&#xff0c;浪费人力和物力&#xff0c;给图书管理者带来极大的资源浪费。随着计算机信息化的普及&#xff0c;对图书的管理带来本质的改变&#xff0c;图书的销售情况以及&#xff0c;图书管理&#xff0c;以及年终对…

搜不到你想找的资料?那是你还没有掌握这些搜索技巧

文章目录 Google搜索命令sitefiletypeintitleinauthor:define:related:OR:- (减号):.. (两个点):weather:stocks:movie:link: 示例site:filetype:intitle:inauthor:define:related:OR:- (减号):.. (两个点):*** (星号):**cache:info:weather:stocks:movie:link: 补充 Google搜索…

解析操作系统是如何启动起来的?

操作系统被称为“第一个程序”&#xff0c;the first programme&#xff0c;原因很简单&#xff0c;只有当操作系统启动起来后才能运行我们编写的程序&#xff0c;那么你有没有想过这个问题&#xff1a;操作系统是怎样启动起来的呢&#xff1f;实际上这个过程就像发射火箭一样有…

解决vue ssr服务端渲染运行时报错:net::ERR_PROXY_CONNECTION_FAILED

现象&#xff1a; 从代码里找了半天也没有找到问题&#xff0c;但是由于ssr服务端渲染配置本身非常复杂&#xff0c;步骤又繁琐&#xff0c; 而且报错又很多&#xff0c;不知道哪里出了问题。 感觉是header或者cookie丢失造成的&#xff0c;因为据说ssr本身有这样的缺陷&…

NHN和SuiFrens合作的限量版配饰正式发售

SuiFrens那些可爱、富有想象力的生物&#xff0c;即将迎来全新装扮&#xff0c;而你也可以一同享受。今天&#xff0c;限量版NHN x SuiFrens Pebble City幸运配饰系列正式推出&#xff0c;同时还有机会在SuiFrens商店免费领取独家限量版NHN帽子。 NHN x SuiFens Pebble City配饰…

17、pytest自动使用fixture

官方实例 # content of test_autouse_fixture.py import pytestpytest.fixture def first_entry():return "a"pytest.fixture def order():return []pytest.fixture(autouseTrue) def append_first(order, first_entry):return order.append(first_entry)def test_s…

CVE初探之漏洞反弹Shell(CVE-2019-6250)

概述 ZMQ(Zero Message Queue)是一种基于消息队列得多线程网络库&#xff0c;C编写&#xff0c;可以使得Socket编程更加简单高效。 该编号为CVE-2019-6250的远程执行漏洞&#xff0c;主要出现在ZMQ的核心引擎libzmq(4.2.x以及4.3.1之后的4.3.x)定义的ZMTP v2.0协议中。 这一…

调试文心大模型或chatgpt的function Calling函数应用场景

沉默了一段时间&#xff0c;最近都在研究AI大模型的产品落地应用&#xff0c;我觉得这个function calling出来后&#xff0c;对目前辅助办公有革命性的改变&#xff0c;可以它来做什么呢&#xff1f;我们先来调试看看&#xff0c;chatgpt和文心大模型的ERNIE Bot支持这个&#…

电力智慧运维系统

电力智慧运维系统是以提高用户侧电力运行安全&#xff0c;降低运维成本为目标&#xff1b;采用智能化运维管理工具—“电易云”&#xff0c;帮助企业建立电力运维体系全方位的信息化、数字化平台&#xff0c;实现设备运行的数字化在线监控与线下维护处理的有机融合&#xff0c;…