AES 加密实践 SpringBoot + Vue

前端

Vue安装crypto-js

npm install crypto-js

编写 js 文件

import CryptoJS from 'crypto-js';
// 密钥一定要16位
const secretKey = '8332dd5974c46b93';

// 加密
export function encrypt(data) {
    const encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

// 解密
export function decrypt(encryptedData) {
    const bytes = CryptoJS.AES.decrypt(encryptedData, secretKey);
    return bytes.toString(CryptoJS.enc.Utf8);
}

编写登录请求

import request from "@/utils/request";

export function login(user) {
    console.log(user)
    return request({
        url: '/login',
        method: 'post',
        data: user
    })
}

登录页面

<template>
    <div class="login">
        <el-card class="box-card">
            <div class="card-text">
                <el-form :model="loginForm" style="margin-top: 8%" :rules="rules" ref="loginForm">
                    <el-form-item prop="username">
                        <el-input v-model="loginForm.username" prefix-icon="el-icon-user" placeholder="用户名"></el-input>
                    </el-form-item>
                    <el-form-item prop="password">
                        <el-input v-model="loginForm.password" prefix-icon="el-icon-lock" placeholder="密码" show-password></el-input>
                    </el-form-item>
                    <el-button type="primary" style="width: 100%" @click="loginValidate()">登录</el-button>
                </el-form>
            </div>
        </el-card>
    </div>
</template>

<script>
import { login } from "@/api/login"
import { encrypt } from "@/utils/encrypt"
export default {
    data() {
        return {
            loginForm: {
                username: null,
                password: null
            },
            rules: {
                username: [
                    { required: true, message: '用户名不能为空', trigger: 'blur' }
                ],
                password: [
                    { required: true, message: '密码不能为空', trigger: 'blur' }
                ]
            }
        }
    },
    methods: {
        loginValidate() {
            this.$refs["loginForm"].validate((valid) => {
            	// 验证非空
                if (!valid) return
                // 加密数据
                var userData = encrypt(JSON.stringify(this.loginForm))
                login(userData).then(resp => {
                    alert(resp.data)
                })
            })
        }
    }
}
</script>

<style scoped>
.login {
    background-color: #708090;
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}

.box-card {
    width: 400px;
}

.card-text {
    text-align: center;
}
</style>

后端

SpringBoot 引入 Gson

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

编写Controller

@RestController
// 解决跨域问题
@CrossOrigin
@Slf4j
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestBody String userData) throws Exception {
    	// 用 json 接收字符串会出现 原数据 123 ,接收到的数据 "123"
    	// 使用 replaceAll 转义\" 删除
        userData = userData.replaceAll("\"", "");
        log.info("解密前=> {}", userData);
        String encrypt = EncryptUtils.decrypt(userData);
        log.info("解密后=> {}", encrypt);
        AdminUserBean adminUserBean = JSONUtils.jsonToObject(encrypt, AdminUserBean.class);
        log.info("序列化后=> {}", adminUserBean);
        return "登录成功";
    }
}

解密工具

public class EncryptUtils {
    public static String decrypt(String data) throws Exception {
        Cipher instance = Cipher.getInstance(AesEncrypt.PADDING);
        instance.init(Cipher.DECRYPT_MODE, AesEncrypt.SECRETKEYSPEC);
        byte[] decodedData = Base64.getDecoder().decode(data);
        byte[] decryptedData = instance.doFinal(decodedData);
        return new String(decryptedData,"UTF-8");
    }
}

密钥配置

public class AesEncrypt {
    /** 密钥 */
    public static final String KEY = "8332dd5974c46b93";
    /** 加密方式 */
    public static final String ALGORITHM = "AES";
    /** 密钥对象 */
    public static final SecretKeySpec SECRETKEYSPEC;
    /** 加密算法*/
    public static final String PADDING = "AES/ECB/PKCS5Padding";

    static {
        SECRETKEYSPEC = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
    }
}

序列化工具

public class JSONUtils {

    private static final Gson gson;

    static {
        gson = new Gson();
    }

    public static <T> T jsonToObject(String jsonData, Class<T> clazz) {
        return gson.fromJson(jsonData, clazz);
    }
}

在这里插入图片描述

执行结果

INFO c.maoslv.api.controller.LoginController  : 解密前=> A09XkUuP8BoNng6p77DlYLf1JjMFbqrj0dKvE7XfSaaDoVnYL/PKfcM/mqrcKbrH
INFO c.maoslv.api.controller.LoginController  : 解密后=> {"username":"123","password":"123"}
INFO c.maoslv.api.controller.LoginController  : 序列化后=> AdminUserBean(id=null, code=null, username=123, password=123, gender=null, createTime=null, updateTime=null, Deleted=null)

本文章举个简单例子,实际还是要以开发中为主

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值