浅析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快速生成数据库文档详情

    下面我将为你详细讲解“java快速生成数据库文档详情”的完整攻略。 1. 环境准备 首先,我们需要安装Java开发环境,JDK和JRE都需要安装。然后,我们需要下载并安装MySQL数据库。 2. 导入数据库表结构 将需要生成文档的数据库表结构信息导出为.sql文件,然后使用MySQL命令行工具或可视化工具导入到本地MySQL数据库中。 mysql -u ro…

    Java 2023年5月19日
    00
  • Spring+MongoDB实现登录注册功能

    下面就为你讲解如何使用Spring和MongoDB实现登录注册功能。 准备工作 安装并启动MongoDB服务器 创建Maven项目,引入所需依赖 xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo…

    Java 2023年6月15日
    00
  • SpringBoot搭建全局异常拦截

    一、概述 在使用Spring Boot开发Web应用的过程中,我们经常会遇到程序抛出异常的情况。如何优雅地处理这些异常,返回友好的错误信息给客户端,是很重要的一件事情。Spring Boot提供了全局异常处理机制,可以方便地实现统一的异常处理逻辑,减少代码重复,提高开发效率。 本文将介绍如何使用Spring Boot自带的全局异常处理机制,搭建一个通用的全局…

    Java 2023年5月27日
    00
  • Spring纯注解开发模式让开发简化更简化

    Spring纯注解开发模式是一种更简单、更方便的Spring开发方式,它无需配置繁琐的XML文件,仅通过注解来实现Spring的各项功能。下面我将为小伙伴们详细讲解如何使用Spring纯注解开发模式,以下内容包括:Spring与注解的关系、Spring纯注解开发模式的使用方法、实例应用以及注意事项。 Spring与注解的关系 Spring 早在2009年的版…

    Java 2023年5月19日
    00
  • SpringBoot 中实现跨域的5种方式小结

    下面是实现Spring Boot中跨域的5种方式的详细攻略: 1. Spring Boot官方文档提供的方式 在Spring Boot官方文档中提供了一个全局配置方式,只需要在配置文件application.properties中添加以下一行配置即可: spring.mvc.cors.allowed-origins=* 这种方式的实现比较简单,适合跨域要求不…

    Java 2023年5月15日
    00
  • 基于java实现租车管理系统

    基于Java实现租车管理系统攻略 一、确定需求和功能 在开始编写代码前,我们需要确定租车管理系统的需求和功能。一般来说,租车管理系统应包括以下功能: 用户注册与登录 汽车信息添加与浏览 租赁订单管理 支付系统 管理员权限控制 二、设计数据库结构 在确定了需求和功能后,我们需要设计数据库结构。租车管理系统主要需要存储以下数据: 用户信息 汽车信息 租赁订单信息…

    Java 2023年5月19日
    00
  • JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)

    下面是针对JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)的详细攻略。 一、文件上传 1.准备工作 在进行文件上传之前,我们需要进行几项基础的准备工作: 在页面中加入文件上传表单,并定义表单的请求方式和处理该请求的servlet路径。 <form action="upload" method="post"…

    Java 2023年5月20日
    00
  • Java中日期格式化YYYY-DD的操作bug

    首先需要明确一点,关于Java日期格式化中YYYY和yyyy的区别。YYYY是基于周的年份,而yyyy是基于实际年份。 假设我们有以下的日期字符串:2021-08-01。如果使用如下的格式化模式:YYYY-DD,希望得到的结果是2021-01。但是实际输出的结果是2020-01。这是由于Java的日期格式化器在处理模式字符串时,YYYY会被认为是“基于周的年…

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