加密算法:
1.可逆加密算法
加密后,密文可以反向解密得到密码原文
1.对称加密
文件加密和解密使用相同的密匙,加密密匙也可以当作解密密匙
解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。
优点:加密速度快,算法公开,加密效率高
缺点:没有非对称加密安全
算法:AES(宇宙最强,基本不可能破解),HS512,HS256, (DES,3DES已被破解,不建议使用)
用途:加密用户隐私信息(姓名、身份证号、银行卡号、手机号)
非对称加密
两个密匙:公开密匙publickey和私有密匙。公匙加密,私匙解密。私匙加密,公匙解密。
解释: 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.
签名:私钥签名, 持有公钥进行验证是否被篡改过.
优点: 非对称加密与对称加密相比,其安全性更好;
算法:RSA,DAS(数字签名用),ECC(移动设备用)
用途:数字签名,数字证书
不可逆算法
解释: 一旦加密就不能反向解密得到密码原文.
单项散列算法:MD5,SHA 这两个可以检验数据完整性 BCRYPT加密密码或卡号
Base64编码
Base64是最常用的用于传输8Bit字节的编码方式之一,用于在HTTP环境下传递较长的标识信息,防止乱码。采用Base64Base64编码解码具有不可读性。
Base64只是一种编码方式,不算加密方法
在线编码工具:图片在线转换base64编码-在线base64编码转换成图片工具
MD5加密,md5相同的密码每次加密都一样,不太安全
//md5加密 DegestUtils:spring框架提供的工具类
String md5Str = DigestUtils.md5DigestAsHex("abc".getBytes());
System.out.println(md5Str);//900150983cd24fb0d6963f7d28e17f72
手动加密(md5+随机字符串)
md5是不可逆加密,md5相同的密码每次加密都一样,不太安全,在md5的基础上加盐(salt)处理,盐存在表中,相对来说不够安全
/**
* 加密方式测试
*/
public class EncryptTest {
/**
* 测试MD5直接加密(不推荐使用,已被破解)
*/
@Test
public void testMd5(){
for (int i = 0; i < 10; i++) {
String pwd = "123456";
String pwdEncypt = DigestUtils.md5DigestAsHex(pwd.getBytes());
System.out.println("加密后的密码:" + pwdEncypt);
}
}
/**
* 测试MD5+盐(场景:常用于用户注册或新增用户存储用户的密码)
*/
@Test
public void testMd5SaltForRegister(){
for (int i = 0; i < 10; i++) {
String pwd = "123456"; //明文密码
String salt = RandomStringUtils.randomAlphanumeric(10); //盐
String pwdNew = pwd + salt;
String pwdEncrypt = DigestUtils.md5DigestAsHex(pwdNew.getBytes());
System.out.println("盐:" +salt +", 加密后:" + pwdEncrypt);
}
}
/**
* 测试MD5+盐(场景:常用于用户登录校验密码)
*/
@Test
public void testMd5SaltForLogin(){
String loginPwd = "123456";
String dbSalt = "0t8OZkQQEQ";
String dbPwd = "550e7408789a65da21420102ac2da109";
//拼接用户登录的密码+表中的盐
String pwdNew = loginPwd + dbSalt;
//进行MD5运算
String pwdEncrypt = DigestUtils.md5DigestAsHex(pwdNew.getBytes());
//将运算后的密码与表中密码做比较
if(dbPwd.equals(pwdEncrypt)){
System.out.println("登录成功");
} else {
System.out.println("密码错误登录失败");
}
}
}
BCrypt密码加密
BCrypt 官网http://www.mindrot.org/projects/jBCrypt/
bcrypt自动加盐,盐不存在表中,足够安全
/**
* 加密方式测试
*/
public class EncryptTest {
/**
* 测试bcrypt加密(常用于用户注册或新增用户对密码进行密码)
*/
@Test
public void testBCryptForRegister(){
for (int i = 0; i < 10; i++) {
String pwd = "123456";
String salt = BCrypt.gensalt();
String pwdEncrypt = BCrypt.hashpw(pwd,salt);
System.out.println("盐:"+salt+",加密后: " +pwdEncrypt);
}
}
/**
* 测试BCrypt校验(常用于用户登录时判断密码是否正确)
*/
@Test
public void testBCryptForLogin(){
String pwd = "123456";
String pwdDB = "$2a$10$owzLG4fiZ4vmUSnmubaY9.FGcTuCDsRqvKNn3wiuYhQnyXNgO.96i";
//判断是否相同,参数1为正常字符串,参数2为加盐后的加密密码。bcrypt自动加盐计算
boolean result = BCrypt.checkpw(pwd, pwdDB);
if(result){
System.out.println("登录成功");
} else {
System.out.println("密码错误登录失败");
}
}
}