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

这篇具有很好参考价值的文章主要介绍了手写一个加盐加密算法(java实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言 

什么是MD5??

 加盐算法

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

如何使用盐加密?

代码实现


前言 

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

        所以我们需要对其加密。

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

  1. MD5加密
  2. 加盐算法

什么是MD5??

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

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

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

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

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

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

 加盐算法

        什么是盐?

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

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

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

手写一个加盐加密算法(java实现),JavaEE初阶,Spring,javaEE进阶,MD5,安全,java

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

如何使用盐加密?

         这里存在一个合约公式,也就是:盐值(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;
    }
}

解密:

        解密的思路就是讲用户输入的密码重新进行一次加密,然后比对从数据库中拿到的是不是一样的:文章来源地址https://www.toymoban.com/news/detail-796093.html

    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实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaEE初阶】 线程池详解与实现

    线程池,是一种线程的使用模式,它为了降低线程使用中频繁的创建和销毁所带来的资源消耗与代价。 通过创建一定数量的线程,让他们时刻准备就绪等待新任务的到达,而任务执行结束之后再重新回来继续待命。 想象这么一个场景: 在学校附近新开了一家快递店,老板很

    2024年02月06日
    浏览(28)
  • 【JavaEE初阶】 定时器详解与实现

    定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码 定时器是一种实际开发中非常常用的组件. 比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连. 比如一个 Map, 希望里面的某个 key 在 3s 之后过

    2024年02月06日
    浏览(24)
  • 加盐加密——保障你的数据安全

    目录 今日良言:理性和激情是生活不可或缺的调味品 一、加盐加密 1.普通密码的缺点 2.什么是加盐加密 3.加盐加密的过程 4.加盐加密的实现 在介绍加盐加密之前,先想想为什么普通密码的缺点是什么? 普通的密码不安全是因为它们通常很容易被猜到或破解。一个简单的密码可

    2024年02月06日
    浏览(35)
  • Python MD5加密的三种方法(可加盐)

    输出结果: 输出结果: 输出结果: (参考文章:https://blog.csdn.net/xuefeng_210/article/details/123112339)

    2024年02月14日
    浏览(41)
  • 密码如何“加盐加密”处理?程序员一定要掌握的知识

    目录 前言 一、手写加盐算法 1.1、加密 1.1.1、加密思路 1.1.2、加密简图 1.1.3、代码实现 1.2、解密 1.2.1、解密思路 1.2.2、解密代码 1.3、验证 二、使用 Spring Security 框架实现加盐算法 为什么要使用加盐的方式对密码进行加密?我们知道传统的 md5 加密方式是可以通过 “彩虹表”

    2024年02月16日
    浏览(36)
  • AEAD加密算法Java实现

    目录 一、什么是认证加密? 二、什么是带关联数据的认证加密? 认证加密 认证解密 常用AEAD算法  三、AEAD_AES_256_GCM加解密Java实现 在消息的传递过程中,既要保持数据的机密性,也要保持数据的完整性。机密性可以依靠信息加密来解决,完整性可以通过消息验证码来检查。

    2024年02月05日
    浏览(24)
  • Java实现密码加密实现步骤【bcrypt算法】

    在Spring Boot和SSM中实现密码加密可以使用bcrypt算法。bcrypt是一种密码哈希函数,通过将密码与随机生成的盐值进行混合,然后再进行多次迭代的计算,最终生成一个安全的哈希密码。 下面是使用bcrypt算法实现密码加密的步骤和代码示例: 通过以上步骤,我们可以在Spring Boot和

    2024年02月11日
    浏览(29)
  • Java 实现 MD5 加密算法

    1.1 MD5 算法介绍 MD5 消息摘要算法,英文:MD5 Message-Digest Algorithm ,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 MD5 是单向加密不可逆的,也就是常说的非对称加密,常用于用户密码的加密,这样即使密

    2024年02月09日
    浏览(46)
  • Java代码实现RSA算法加密解密文件功能

    底层算法不做赘述,想要了解自行百度。 RSA属于非对称加密,非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份

    2024年02月12日
    浏览(38)
  • JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 UDP 通信         1.1 DatagramSocket 类         1.2 DatagramPacket 类         1.3 实现 UDP 通信(一发一收)         1.3.1 客户端的开发         1.3.2 服务端的开发         1.4 实

    2024年04月26日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包