Java常用的加密方式
1.BASE64
严格来说BASE64不算是加密,而是对其编码格式进行修改,使之变为不易被人识别的形式。在实际使用中,将密码加密并储存到数据库中,登录时取出存储的密码,进行解密
/**
* @author Myriven
* @date 2019/12/23 14:23
* @description
*/
/*BASE564加密*/
public class BASE64Demo {
public static void main(String[] args) throws IOException {
String broforePWD="password";
System.out.println("加密前:"+broforePWD);
String afterPWD = encryptBASE64(broforePWD.getBytes());
System.out.println("加密后:"+afterPWD);
byte[] bytes = decryptBASE64(afterPWD);
System.out.println("解密后:"+new String(bytes));
}
/*加密*/
public static String encryptBASE64(byte[] pwd){
String result= new BASE64Encoder().encodeBuffer(pwd);
return result;
}
/*解密*/
public static byte[] decryptBASE64(String pwd) throws IOException {
byte[] bytes = new BASE64Decoder().decodeBuffer(pwd);
return bytes;
}
}
2.MD5
MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
MD5加密属于不可逆加密,在实际使用中,将密码加密后存储到数据库中,在登录的时候将输入的密码获取到,再次通过该加密算法加密,与数据库中存储的进行比较判断密码输入的是否正确
MD5有哪些特点
MD5加密的特点主要有以下几点:
1、针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);
2、其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。
3、运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。
4、对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。
java自带的MD5加密
/**
* @author Myriven
* @date 2019/12/23 14:50
* @description
*/
/*md5加密*/
public class MD5Demo {
public static void main(String[] args) throws NoSuchAlgorithmException {
String pwd="password";
// 生成一个MD5加密计算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 计算md5函数
md.update(pwd.getBytes());
// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
//一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
System.out.println("JAVA自带md5加密==========>"+ new BigInteger(1, md.digest()).toString(16));
}
}
spring自带的工具DigestUtils实现
DigestUtils.md5DigestAsHex("password".getBytes())
3.BCrypt
原文网址: https://www.cnblogs.com/xingzc/p/8624007.html
public class BCryptDemo {
public static void main(String[] args) {
String newPWD= "password";
//加密
String newPWD= BCrypt.hashpw(newPWD, BCrypt.gensalt());
System.out.println("加密后:"+newPWD);
//BCrypt.gensalt(12)表示加盐,gensalt中的参数决定了他的复杂性,默认是10
String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12));
String candidate = "testpassword";
//检查未加密的密码(candidate)是否与加密的密码一致,进行比较,如果相同返回true
if (BCrypt.checkpw(candidate,newPWD)){
System.out.println("密码相同");
}else{
System.out.println("密码不同");
}
}
}
什么是加盐?
如果两个人或多个人的密码相同,加密后保存会得到相同的结果。破一个就可以破一片的密码。如果名为A的用户可以查看数据库,那么他可以观察到自己的密码和别人的密码加密后的结果都是一样,那么,别人用的和自己就是同一个密码,这样,就可以利用别人的身份登录了。
其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。