有哪些常用的加密算法?

483 阅读3分钟

咱们在开发过程中很多地方都要用到加密,比如前端传回密码、数据库中存储密码、配置文件中放密码,这些地方都要用密文,不然就得挨板子

今天来简单总结一下,各种常见的加密算法

上图

image-20230114202536813.png

释义:

  • 可逆加密算法:

    释义:加密后, 密文可以反向解密得到密码原文,因此称为可逆加密算法

    • 对称加密:

      释义:将明文和加密密钥一起用加密算法处理,变成密文发送出去,收信方用加密密钥及该加密算法的逆算法解密密文,得到可读明文

      在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥

      **优点:**算法公开、计算量小、加密速度快、加密效率高

      缺点: 没有非对称加密安全

      **场景:**保存用户手机号、身份证等敏感但能解密的信息

    • 非对称加密

      释义:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端

      有私钥加密、公钥加密两种方式:公钥加密,持有私钥才可解密;私钥加密,持有公钥才可以解密

      **优点:**安全性更好

      缺点: 加密和解密花费时间长、速度慢,只适合对少量数据进行加密

  • 不可逆加密算法:

    **释义:**一旦加密就不能反向解密得到密码原文

    **场景:**校验下载文件正确性,一般在网站上下载文件都能见到;存储密码、 卡号等不可解密的敏感信息

  • 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

实际开发中可以这么做:前端、后端使用不同的方式进行加密,避免传输明文、同时避免存储明文。