手写一个加盐加密算法(java实现)

2024-01-05 11:44

本文主要是介绍手写一个加盐加密算法(java实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言 

什么是MD5??

 加盐算法

那别的人会不会跟你得到相同的UUID? 

如何使用盐加密?

代码实现


前言 

        对于我们常见的登录的时候需要用到的组件,加密是一个必不可少的东西,如果我们往数据库存放用户的密码,是直接以明文存储的话,那么数据被窃取的时候,损失也就是最大的,因为别人可以很直观的看到你的用户数据,不需要任何破解成本。

        所以我们需要对其加密。

        目前最常见的两种数据加密方法:

  1. MD5加密
  2. 加盐算法

什么是MD5??

        简单来说,md5就是讲遗传字符串通过某种特定的算法,来将其变化成另外一种形式,这样子就从明文的外观变成另外一个样子。但是由于背后的算法格式是固定的,所以每一个字符串都有固定的MD5格式。

       有的用户为了方便记忆,把密码设置成简单的,有规律的字母或者数字组合,有的也喜欢使用单独一个单词这种,举一个简单的例子,例如密码1234567,和密码1726354,这两种密码,因为格式简单,很容易就被一次一次的试出来,也就是被暴力破解。

        然后我们使用1234567进行MD5加密,但是这样就会让数据完全处于安全状态吗?

        具体如何破解?也就是讲得到的,讲得到的密码进行MD5转换成为对应的哈希,然后于最初的哈希进行比对,要是匹配,那么这个密码就已经暴露给别人了

        MD5底层存在一张彩虹表,几乎标记了所有字符串的MD5对照表。

        有了彩虹表MD5就相当于是不存在了,因为一种字符串就只有一种特定的MD5格式

 加盐算法

        什么是盐?

        其实盐就是一个随机值,没有任何规律,通过UUID.randomUUID()来生成一个唯一盐值。这个uuid是唯一的,具体唯一就是根据你的mac地址等内容生成的一个世界唯一的值,

那别的人会不会跟你得到相同的UUID? 

下面的内容来自百度百科:

        官方说明:产生错误的情况非常低,是故大可不必考虑这个重复的问题

如何使用盐加密?

         这里存在一个合约公式,也就是:盐值(32位)+  $  + MD5加密后的密码

        加密思路:用户输入一个明文密码,通过UUID得到一个盐值,这段密码首先使用MD5和盐值进行一个基本的加密,然后使用合约公式,将盐值和使用MD5+盐值生成的合约公式存入数据库

        如何解密:这里的解密,不是指的直接将我们得到的合约公式又解密成明文,比如,用户想要登录,于是他输入了他之前设置的密码。这个密码被后端得到之后,就会进行验证,具体就是首先记住这个明文,然后通过数据库中存储的对应用户的合约公式拿出来,通过$来获取盐值,然后将用户输入的明文和拿到的盐值进行MD5加密,然后再合成一个:

盐值(32位)+  $  + MD5加密(盐值+用户输入的密码),

那么现在就有两个合约公式了,一个是用户注册时候生成的,一个是用户刚刚输入的,后台自动生成的合约公式

        如果两个合约公式是一样的,那么就说明现在正在登录这个账户的人是这个账户的持有者,就可以允许访问

代码实现

         在实现这个功能之前,你需要引入一个工具类,可以前往maven下载,地址为:

<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version> <!--根据需要选择合适版本-->
</dependency>

代码案例:

import org.apache.commons.codec.digest.DigestUtils;public class Main {public static void main(String[] args) {String input = "Hello World"; // 输入字符串// 计算MD5值String md5Hash = DigestUtils.md5Hex(input);System.out.println("MD5 Hash: " + md5Hash);}
}

根据上面的案例进行加密:

//  import org.apache.commons.codec.digest.DigestUtils;
//
//  import java.util.UUID;    
public static String encrypt(String password) {// 首先生产一个盐值// UUID.randomUUID() 会生成32位数字,然后+4位‘-’,我们不需要关注‘-’在盐值的什么位置,我们只需要去除它String salt = UUID.randomUUID().toString();System.out.println(salt);// 去除‘-’salt = salt.replaceAll("-","");// 然后使用盐值和传进来的密码进行md5加密String saltPassowrd = DigestUtils.md5Hex((salt+password).getBytes());// 然后和盐值进行拼接,然后返回String finalPassword = salt + '$' + saltPassowrd;return  finalPassword;}
}

解密:

        解密的思路就是讲用户输入的密码重新进行一次加密,然后比对从数据库中拿到的是不是一样的:

    public static boolean check(String inputPassword, String finalPassword){//首先判断这两个参数到底有没有值,并且判断数据库中拿到的finalPassword的length是否为65;if (inputPassword == null || inputPassword.isEmpty()) {// 这里先判断为不为空是因为后面的isEmpty的前提是字符串不为null,不然就会发生空指针异常return false;}if (finalPassword == null || finalPassword.isEmpty() || finalPassword.length() != 65) {return false;}// 从finalPassword中拿到盐值String salt = finalPassword.split("\\$")[0];String saltPassword = DigestUtils.md5Hex((salt+inputPassword).getBytes());String ret = salt + '$' + saltPassword;if (ret.equals(finalPassword)) {return true;}return false;}

这篇关于手写一个加盐加密算法(java实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法