浅析Java 常用的 4 种加密方式(MD5+Base64+SHA+BCrypt)

浅析Java 常用的 4 种加密方式(MD5+Base64+SHA+BCrypt)

MD5加密

MD5算法是一种散列函数,可以将任意长度的数据转化成一定长的散列值。通常用于密码加密。使用Java自带包java.security.MessageDigest中的getInstance("MD5")方法获取MD5的实例,加密方式如下:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class MD5Util {

    /**
     * MD5加密
     *
     * @param password 待加密字符串
     * @return 密文字符串
     * @throws NoSuchAlgorithmException
     */
    public static String encrypt(String password) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] bytes = md5.digest(password.getBytes());
        return Base64.getEncoder().encodeToString(bytes);
    }
}

以上代码中,password为待加密字符串,Base64.getEncoder().encodeToString(bytes)可以将转化为字符串,实现加密。

Base64加密

Base64加密是一种二进制到文本的编码方式,常用于防止二进制数据在传输过程中被篡改。使用Java自带包java.util.Base64进行Base64加密,加密方式如下:

import java.util.Base64;

public class Base64Util {

    /**
     * Base64加密
     *
     * @param str 待加密字符串
     * @return 密文字符串
     */
    public static String encrypt(String str) {
        byte[] bytes = str.getBytes();
        return Base64.getEncoder().encodeToString(bytes);
    }

    /**
     * Base64解密
     *
     * @param str 待解密字符串
     * @return 原文字符串
     */
    public static String decrypt(String str) {
        byte[] bytes = Base64.getDecoder().decode(str);
        return new String(bytes);
    }
}

以上代码中,encrypt方法可以将传入的字符串先转化为字节数组,再使用Base64.getEncoder().encodeToString(bytes)进行加密;decrypt方法则是解密方法。

SHA加密

SHA是一种哈希算法,可用于密码加密,提供了比MD5更强的安全性。使用Java自带包java.security.MessageDigest中的getInstance("SHA")方法获取SHA实例,加密方式与MD5相似:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class SHAUtil {

    /**
     * SHA加密
     *
     * @param password 待加密字符串
     * @return 密文字符串
     * @throws NoSuchAlgorithmException
     */
    public static String encrypt(String password) throws NoSuchAlgorithmException {
        MessageDigest sha = MessageDigest.getInstance("SHA");
        byte[] bytes = sha.digest(password.getBytes());
        return Base64.getEncoder().encodeToString(bytes);
    }
}

以上代码中,password为待加密字符串,Base64.getEncoder().encodeToString(bytes)可以将转化为字符串,实现加密。

BCrypt加密

BCrypt算法是一种可变加盐的哈希算法,较为安全,可用于密码加密。使用第三方包org.mindrot.jbcrypt.BCrypt进行BCrypt加密,需要注意需要先导入该包,加密方式:

import org.mindrot.jbcrypt.BCrypt;

public class BCryptUtil {

    /**
     * BCrypt加密
     *
     * @param password 待加密字符串
     * @return 密文字符串
     */
    public static String encrypt(String password) {
        return BCrypt.hashpw(password, BCrypt.gensalt());
    }

    /**
     * BCrypt校验密码
     *
     * @param password 待校验密码
     * @param hashedPassword 已加密的密码
     * @return 校验结果
     */
    public static boolean checkPassword(String password, String hashedPassword) {
        return BCrypt.checkpw(password, hashedPassword);
    }
}

以上代码中,encrypt方法使用BCrypt.hashpw(password, BCrypt.gensalt())实现加密;checkPassword方法则是校验已加密的密码与待校验密码是否一致。

示例说明

示例1

需求:将用户名和密码进行MD5加密,并将生成的密文写入数据库

import java.security.NoSuchAlgorithmException;

public class User {

    private Long id;
    private String username;
    private String password;

    public void save() {
        String encryptedPassword = null;
        try {
            encryptedPassword = MD5Util.encrypt(password);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 将加密后的密码存储到数据库中
        userMapper.save(new User(id, username, encryptedPassword));
    }

    // 省略getter和setter方法
}

以上代码中,使用MD5Util.encrypt(password)将密码加密,并存储到数据库中。

示例2

需求:用户注册时,对密码进行BCrypt加密并存储到数据库中;用户登录时,校验密码是否正确

import org.mindrot.jbcrypt.BCrypt;

public class UserController {

    public void register(User user) {
        String hashedPassword = BCryptUtil.encrypt(user.getPassword());
        user.setPassword(hashedPassword);
        userMapper.save(user);
    }

    public void login(String username, String password) {
        User user = userMapper.findByUsername(username);
        if (user == null) {
            throw new RuntimeException("用户名不存在");
        }
        boolean passwordValid = BCryptUtil.checkPassword(password, user.getPassword());
        if (!passwordValid) {
            throw new RuntimeException("密码不正确");
        }
        // 用户名和密码校验成功,完成登录操作
    }
}

以上代码中,register方法使用BCryptUtil.encrypt(user.getPassword())将密码加密,login方法使用BCryptUtil.checkPassword(password, user.getPassword())校验密码是否正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java 常用的 4 种加密方式(MD5+Base64+SHA+BCrypt) - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Java多线程编程中ThreadLocal类的用法及深入

    Java多线程编程中ThreadLocal类的用法及深入详解 什么是ThreadLocal类? ThreadLocal是Java中一个非常重要的线程工具类。它为每个线程提供了一个单独的副本,可以在整个线程的声明周期中使用,且该副本可以在任何时候被当前线程访问。该工具类通常用于线程安全地处理共享对象。 ThreadLocal类的用法 ThreadLocal类是…

    Java 2023年5月19日
    00
  • SpringMVC执行过程详细讲解

    以下是关于“SpringMVC执行过程详细讲解”的完整攻略,其中包含两个示例。 SpringMVC执行过程详细讲解 SpringMVC是一个基于M模式的Web框架,它可以帮助我们快速开发Web应用程序。本文将介绍SpringMVC的执行过程。 执行过程 SpringMVC的执行过程可以分为以下几个步骤: 客户端发送请求到DispatcherServlet。 …

    Java 2023年5月16日
    00
  • Kafka producer端开发代码实例

    下面是详细的Kafka producer端开发代码实例攻略: 1. 搭建开发环境 首先,需要搭建Kafka的开发环境。可以参考官方文档:http://kafka.apache.org/quickstart。 2. 引入Kafka的依赖库 在Maven项目中,需要引入以下依赖: <dependency> <groupId>org.apa…

    Java 2023年5月20日
    00
  • java实战小技巧之优雅的实现字符串拼接

    下面是关于”Java实战小技巧之优雅的实现字符串拼接”的攻略。 背景 字符串拼接是Java开发中比较基础的操作之一,但是在不注意的情况下,随意的字符串拼接方式可能会导致代码的可读性和可维护性下降。因此,在进行Java开发时,需要注意如何优雅地实现字符串拼接,提高代码的可读性、可维护性和效率。 方式一:使用StringBuilder 在Java中,字符串拼接的…

    Java 2023年5月26日
    00
  • 基于JVM-jinfo的使用方式

    基于JVM的jinfo工具可以帮助我们在运行中的JVM进程中实时查看和修改指定Java进程的配置参数,以及输出JVM内部配置信息和线程堆栈信息等。 以下是使用jinfo的步骤: 步骤一:查看运行中的JVM进程 在使用jinfo工具前,需要先确认当前运行中的JVM进程PID。可以使用jps命令查看,例如: $ jps 2386 Bootstrap 2834 J…

    Java 2023年5月26日
    00
  • Spring JDBC 框架简介

    下面是“Spring JDBC 框架简介”的详细攻略。 1. Spring JDBC 简介 Spring JDBC 框架是通过 JDBC API 来访问关系型数据库的一个全面的框架。Spring JDBC 包含如下四个关键组件:JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcInsert 和 SimpleJ…

    Java 2023年5月19日
    00
  • Springboot中静态文件的两种引入方式总结

    下面是详细的“Springboot中静态文件的两种引入方式总结”的攻略: 1. 静态文件的常规引入方式 在Springboot项目中,我们可以将静态文件放置在项目的“resources/static”目录下,这些文件就可以被访问到。 在html文件中,我们可以用如下代码来引入静态文件: <link rel="stylesheet" …

    Java 2023年5月20日
    00
  • Java–SSH,SSM和Spring Boot框架区别及优缺点说明

    Java中的SSH、SSM和Spring Boot框架都是常用的Web开发框架,它们各自有着不同的优缺点和适用场景。以下是Java中SSH、SSM和Spring Boot框架的区别及优缺点说明的完整攻略: SSH框架 SSH框架是指Struts2 + Spring + Hibernate框架的组合。它是Java Web开发中最常用的框架之一,具有以下优点: …

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部