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

yizhihongxing

浅析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实现百万级别数据导出excel的三种方式

    我来详细讲解一下“使用Java实现百万级别数据导出Excel的三种方式”的完整攻略。 一、背景介绍 随着数据量的急剧增长,在实际工作中,我们经常需要将海量数据导出到Excel中进行分析和处理。但是当数据量达到百万甚至千万级别时,传统的导出方式会遭遇一系列的问题,比如内存溢出、导出速度过慢等。在这种情况下,我们需要使用一些高效、稳定的方式实现数据的导出。本文将…

    Java 2023年5月20日
    00
  • Jsp中如何让图片在div中居中

    让图片在 DIV 中居中可以使用 CSS 实现。下面是操作步骤和两个示例说明: 步骤 在 JSP 文件中,使用 <div> 标签定义包含图片的容器。 给此 div 标签设置宽度、高度、背景等样式,使其成为一个完整的盒子。 在 div 中嵌套 img 标签,定义图片的地址和大小。 在 CSS 样式文件中,使用 text-align: center;…

    Java 2023年6月15日
    00
  • 快速排序的原理及java代码实现

    下面我来详细讲解一下“快速排序的原理及Java代码实现”的完整攻略。 1. 快速排序的原理 快速排序是一种常见的排序算法,其基本思想是:选择一个基准元素,将待排序序列分成两个子序列,使得左边的子序列元素都小于等于基准元素,右边的子序列元素都大于等于基准元素,然后递归地对子序列进行排序,直到整个序列有序。 具体的实现过程如下: 从待排序序列中选择一个基准元素,…

    Java 2023年5月19日
    00
  • spring boot整合CAS Client实现单点登陆验证的示例

    介绍一下如何使用Spring Boot整合CAS Client实现单点登录验证。 准备工作 在maven或gradle中引入Spring Boot Cas Starter。 配置CAS Server地址。 示例一:配置客户端登录方式 配置CAS Client,添加以下配置: cas: server-url-prefix: https://cas.server…

    Java 2023年5月20日
    00
  • 让javascript加载速度倍增的方法(解决JS加载速度慢的问题)

    下面是一份详细讲解“让 JavaScript 加载速度倍增的方法”的攻略,希望能够帮助到你。 为什么要关注 JavaScript 的加载速度 JavaScript 是网页的重要组成部分之一,但是在加载过程中可能会带来用户体验的负面影响。如果加载速度过慢,会导致页面变得卡顿,用户体验不佳,同时也会对网站的排名和转化率造成不良影响。因此,关注 JavaScrip…

    Java 2023年6月15日
    00
  • 详解Java中static关键字和内部类的使用

    详解Java中static关键字和内部类的使用 Java中的static关键字和内部类是程序设计中非常重要的特性,本文将全面讲解它们的使用。 static关键字 概念 static关键字可以用来修饰类的成员变量和成员方法。 当static关键字被修饰成员变量时,该变量成为静态变量,也可以称为类变量。静态变量的特点是在内存中只有一份,无论有多少个对象被创建,静…

    Java 2023年5月26日
    00
  • 关于Tomcat的服务器使用及说明

    关于Tomcat的服务器使用及说明 Tomcat是一款开放源代码的Web服务器,可用于运行Java Servlet和JavaServer Pages(JSP)等Web应用程序。在本篇攻略中,我们将详细讲解如何使用Tomcat服务器并说明一些基本概念和操作步骤。 下载和安装 首先,您需要从Tomcat官网(http://tomcat.apache.org/)下…

    Java 2023年6月16日
    00
  • Sprint Boot @Cacheable使用方法详解

    Spring Boot的@Cacheable注解 在Spring Boot中,@Cacheable注解用于启用缓存支持。使用@Cacheable注解可以将方法的返回值缓存起来,并在下一次调用该方法时直接返回缓存的结果,而不是再次执行该方法。本文将详细介绍@Cacheable注解的作用和使用方法,并提供两个示例说明。 @Cacheable注解作用 在Sprin…

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