浅析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技术站