• 使用AES-128-CBC 加密用户名和密码 完成登陆 前端Vue 后端springboot


    AES 属于对称加密
    优点:算法公开、计算量小、加密速度快、加密效率高 
    缺点:密钥的管理和分发,困难,不够安全。因为双方都必须保存好密钥,有一方泄露数据就不安全。
    =》适用场景:我的后台管理系统(1对1),这样既简单又合适。

    一、spring boot 中新建一个Aes工具类

    注意:我使用的是PKCS5Padding填充方式,主要原因是它在jdk中是自带的,同时PKCS5 和7本质差不多。而 使用PKCS7Padding我一直没找到对应得依赖包。

    1. @Slf4j
    2. @Component
    3. public class AesTool {
    4. //前后端约定的 key
    5. private static final String KEY = "bhd63ymfkfnu8ynk";
    6. //参数分别代表 算法名称/加密模式/数据填充方式
    7. private static String algorithmStr = "AES/CBC/PKCS5Padding";
    8. //偏移量
    9. private static String offsetStr = "0000000000000000";
    10. private static byte[] ivByte = offsetStr.getBytes();
    11. /**
    12. * 加密
    13. * @param content 加密的字符串
    14. * @param encryptKey key值
    15. * @return
    16. * @throws Exception
    17. */
    18. public static String encrypt(String content, String encryptKey) throws Exception {
    19. /* Cipher类提供了针对加密和解密的密码 encrypt mode(加密模式) */
    20. Cipher cipher = Cipher.getInstance(algorithmStr);
    21. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"),generateIV(ivByte));
    22. byte[] b = cipher.doFinal(content.getBytes("utf-8"));
    23. // 采用base64算法进行转码,避免出现中文乱码
    24. return Base64.encodeBase64String(b);
    25. }
    26. /**
    27. * 解密
    28. * @param encryptStr 解密的字符串
    29. * @param decryptKey key值
    30. * @return
    31. * @throws Exception
    32. */
    33. public static String decrypt(String encryptStr, String decryptKey) throws Exception {
    34. /* Cipher类提供了针对加密和解密的密码 decrypt mode(解密模式) */
    35. Cipher cipher = Cipher.getInstance(algorithmStr);
    36. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"), generateIV(ivByte));
    37. // 采用base64算法进行转码,避免出现中文乱码
    38. byte[] encryptBytes = Base64.decodeBase64(encryptStr);
    39. byte[] decryptBytes = cipher.doFinal(encryptBytes);
    40. return new String(decryptBytes);
    41. }
    42. public static String myEncrypt(String content) throws Exception {
    43. return encrypt(content, KEY);
    44. }
    45. public static String myDecrypt(String encryptStr) throws Exception {
    46. return decrypt(encryptStr, KEY);
    47. }
    48. // 生成iv(应该就是偏移量)
    49. public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
    50. AlgorithmParameters params = AlgorithmParameters.getInstance("AES");
    51. params.init(new IvParameterSpec(iv));
    52. return params;
    53. }
    54. }

    在mian方法测试

    1. Map map=new HashMap<String,String>();
    2. map.put("中文","value");
    3. map.put("hello","world");
    4. String content = JSONObject.toJSONString(map);
    5. System.out.println("加密前:" + content);
    6. try {
    7. String encrypt = AesTool.myEncrypt(content);
    8. System.out.println("加密后:" + encrypt);
    9. String decrypt = AesTool.myDecrypt(encrypt);
    10. System.out.println("解密后:" + decrypt);
    11. }catch (Exception e){
    12. e.printStackTrace();
    13. }

    效果图

     

     二、vue中加密

    首先导入crypto-js这个支持AES加密的依赖库

    npm install crypto-js

    新建一个AesEncrypt 的js文件

    1. import CryptoJS from "crypto-js"
    2. //默认自定义的约定密钥(与后端密钥保持一致)
    3. const KEY = CryptoJS.enc.Utf8.parse("bhd63ymfkfnu8ynk");// 内容可自定义 16位长度字符
    4. const IV = CryptoJS.enc.Utf8.parse("0000000000000000"); // 密钥偏移量 16位长度字符
    5. /**
    6. * AES对称加密 (CBC模式,需要偏移量)
    7. * @param {Object} params 明文参数
    8. */
    9. export const encrypt = (str) => {
    10. let key = KEY
    11. let iv = IV
    12. //明文
    13. let srcs = CryptoJS.enc.Utf8.parse(str);
    14. console.log("明文")
    15. console.log(srcs);
    16. //加密
    17. var encrypt = CryptoJS.AES.encrypt(srcs, key, {
    18. iv: iv,
    19. mode: CryptoJS.mode.CBC, //AES加密模式
    20. padding: CryptoJS.pad.Pkcs7 //填充方式,这里后端是5 也可以用
    21. });
    22. console.log("加密后");
    23. console.log(encrypt);
    24. console.log("base64加密");
    25. console.log(CryptoJS.enc.Base64.stringify(encrypt.ciphertext))
    26. return CryptoJS.enc.Base64.stringify(encrypt.ciphertext); //返回base64格式密文
    27. }

    三、AES-128-CBC 基础知识点

    这个是使用AES加密算法的CBC模式,使用128位数据块为一组进行加密解密,

    即16字节明文,对应16字节密文,

    明文加密时,如果数据不够16字节,则会将数据补全剩余字节

    • 若最后剩余的明文不够16字节,需要进行填充,通常采用PKCS7进行填充。比如最后缺3个字节,则填充3个字节的0x03;若最后缺10个字节,则填充10个字节的0x0a;

    • 若明文正好是16个字节的整数倍,最后要再加入一个16字节0x10的组再进行加密

    加密时需要的参数

    1、传入要加密的明文
    2、传入一个16字节的key(同后端key一致)
    3、传入一个16字节的初始偏移向量IV  (同后端key一致)

  • 相关阅读:
    csv/json/list/datatable导出为excel的通用模块设计
    window下redis安装
    【计算机视觉40例】案例34:勾勒五官轮廓
    聊聊我们Java中代码优化的30个小技巧
    STM32之SPI和W25Q128
    降低半导体金属线电阻的沉积和蚀刻技术
    vmware设置桥接模式后ip设置
    用HTML+CSS做一个漂亮简单的音乐网站
    面向对象分析与设计(图书管理系统)--实验4活动图
    hive窗口函数记录
  • 原文地址:https://blog.csdn.net/tengyuxin/article/details/125896473