咱们在开发过程中很多地方都要用到加密,比如前端传回密码、数据库中存储密码、配置文件中放密码,这些地方都要用密文,不然就得挨板子
今天来简单总结一下,各种常见的加密算法
上图
释义:
-
可逆加密算法:
释义:加密后, 密文可以反向解密得到密码原文,因此称为可逆加密算法
-
对称加密:
释义:将明文和加密密钥一起用加密算法处理,变成密文发送出去,收信方用加密密钥及该加密算法的逆算法解密密文,得到可读明文
在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥
**优点:**算法公开、计算量小、加密速度快、加密效率高
缺点: 没有非对称加密安全
**场景:**保存用户手机号、身份证等敏感但能解密的信息
-
非对称加密
释义:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端
有私钥加密、公钥加密两种方式:公钥加密,持有私钥才可解密;私钥加密,持有公钥才可以解密
**优点:**安全性更好
缺点: 加密和解密花费时间长、速度慢,只适合对少量数据进行加密
-
-
不可逆加密算法:
**释义:**一旦加密就不能反向解密得到密码原文
**场景:**校验下载文件正确性,一般在网站上下载文件都能见到;存储密码、 卡号等不可解密的敏感信息
-
Base64编码:
释义: 严格来说,Base64只是一种编码方式,不算加密方法
**场景:**用于使数据或文件具备不可读性,即所编码的数据不会被人直接用肉眼看到
示例
比较流行的MD5和BCrypt,通常会用于咱们数据库里给用户密码等敏感信息加密,下面列出了三种用法:MD5、MD5加盐、BCrypt
相对来说,BCrypt比MD5更安全
需要注意:BCrypt不支持反运算,只支持密码校验
//MD5
String md5Str = DigestUtils.md5DigestAsHex("xingye9527".getBytes()); //52569c045dc348f12dfc4c85000ad832
//MD5加盐
String salt = RandomStringUtils.randomAlphanumeric(10); //获取一个10位的随机字符串
String saltPswd = DigestUtils.md5DigestAsHex(("xingye9527"+salt).getBytes()); //b8545389782b56392fcc71bbff1b3b06
//BCrypt加密
String gensalt = BCrypt.gensalt(); //这个是随机生成的盐,29个字符
String password = BCrypt.hashpw("xingye9527", gensalt); //用盐加密,加密后的字符串前29位就是盐,$2a$10$4hj7HWPPvDrcScePca9qq.crarkb3IhjAl1pDAI50pZLc4aGNWGyG
Boolean checkpw = BCrypt.checkpw("xingye9527", "$2a$10$4hj7HWPPvDrcScePca9qq.crarkb3IhjAl1pDAI50pZLc4aGNWGyG");
//RSA公钥加密
RSA rsa = SecureUtil.rsa("私钥", "公钥");
String encryptStr = rsa.encryptBase64("xingye9527", KeyType.PublicKey);
//RSA私钥解密
RSA rsa1 = new RSA("私钥",null);
String decryptStr= rsa1.decryptStr(encryptStr,KeyType.PrivateKey, CharsetUtil.CHARSET_UTF_8);
//RSA私钥加密
RSA rsa = SecureUtil.rsa("私钥", "公钥");
String encryptStr = rsa.encryptBase64("xingye9527", KeyType.PrivateKey);
//RSA公钥解密
RSA rsa1 = new RSA("私钥",null);
String decryptStr= rsa1.decryptStr(encryptStr,KeyType.PublicKey, CharsetUtil.CHARSET_UTF_8);
Tips
实际开发中可以这么做:前端、后端使用不同的方式进行加密,避免传输明文、同时避免存储明文。