【Vue功能实现】JAVA+VUE前后端RES加解密

java后端+vue前端的一次请求参数对称加密过程,采用了res加密规则

一、后端RES加解密

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * RES加解密
 */
public class AesUtil {
	// 16位
    // 密盐key,不可泄露
	private final static String SECRET_KEY = "";
    // 字符集
	private final static String ENCODING = "utf-8";

	public static String encode(String text) throws Exception {
		return encode(SECRET_KEY, text);
	}

	public static String decode(String text) throws Exception {
		return decode(SECRET_KEY, text);
	}

	public static String encode(String key, String text) throws Exception {
		byte[] encryptData = {};
		try {
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, keySpec);
			encryptData = cipher.doFinal(text.getBytes(ENCODING));
		} catch (Exception e) {
			System.out.println("aesEncodeErr :调用encode失败! "+e.getMessage());
			throw e;
		}
		return Base64.encodeBase64String(encryptData);
	}

	public static String decode(String key, String text) throws Exception {
		try {
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, keySpec);
			byte[] bOut = cipher.doFinal(Base64.decodeBase64(text));
			text = new String(bOut);
		} catch (Exception e) {
			System.out.println("aesDecodeErr :调用decode失败!"+ e.getMessage());
			throw e;
		}
		return text;
	}

    /**
     * 测试方法
     */
	public static void main(String[] args) {
		String text = "加密内容";
		try {
            System.out.printf("加密:%s \n", encode(text));
            System.out.printf("解密:%s \n", decode(encode(text)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

二、前端RES加密

在vue中使用RES加解密,推荐使用 crypto-js,可以本地引入js文件也可以使用npm命令安装插件

1.引入本地js(crypto-js cdn

在公共文件下引入本地js,即可在项目下直接使用CryptoJS对象来加解密明文数据,如下面我们在index.html下直接引入cryptoJS.min.js文件:

2.npm方式引入 js

npm install crypto-js --save

完成js插件的安装后,需要再引用一下插件才能调用其方法,如下:

import cryptoJs from 'crypto-js'

 3.关键代码

// 当你采用的是npm方式引入插件,则需要再引用一下该插件
// import cryptoJS from 'crypto-js'

// 加密所需的key
const KEY = '' 

// DES加密
export const encryptDes = (msg) => {
  var keyHex = CryptoJS.enc.Utf8.parse(KEY)
  var option = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }
  var encrypted = CryptoJS.AES.encrypt(msg, keyHex, option)
  return encrypted.ciphertext.toString()
}

// DES解密
export const decryptDes = (msg) => {
  var keyHex = CryptoJS.enc.Utf8.parse(KEY)
  var decrypted = CryptoJS.AES.decrypt(
    {
      ciphertext: CryptoJS.enc.Utf8.parse(msg)
    },
    keyHex,
    {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7
    }
  )
  return decrypted.toString(CryptoJS.enc.Utf8)
}

三、关键细节拓扑

上述代码中,我们看到很多如字符集utf8,ECB,PKcs7等等熟悉或陌生的词汇出现,他们分别在加解密过程中担当这什么作用又分别代表什么呢?

这些其实都是前后端必须预先约定好的规则。

1、字符集

首先是字符集,我们必须规定好是统一使用utf8或是hex编码规范。

2、对称加密模式

其次是对称加密模式(既ECB),相较于ECB,其实我们还 CBC/CFB/OFB/CTR四种,各种加密模式不再赘述,可以自行去深入了解。

2、填充补位规则

而最后PKcs7则是五种加密模式中的一类填充规则,在五种加密模式中,除了OFB/CTR不需要做填充补位外,其余三种模式都需要补位,为什么会呢?原因是AES加密方式只能加密 128bit 的分块,他的原来简要来说其实就是对明文简单的按照 128bit 为一个分块进行切割,然后把每个分块分别进行AES加密,最后再将得到的密文进行拼接得到想要的结果,而实际情况下,我们的明文往往可能不是标准的 128bit,当一个分块不足 128bit 时我们就需要对其进行补位,按填充规则填充至 128bit,而填充规则共六种NoPaddingPKCS#5(PKCS5Padding)、PKCS#7(PKCS7Padding)、 ISO 10126ANSI X9.23ZerosPadding

以上就是本次前后端AES加密过程的所有分享!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现Java+Vue的家谱前后端分离系统,可以分为以下几个步骤: 1. 设计数据库表结构:可以设计Person表来存储每个人的信息,包括姓名、性别、父亲ID、母亲ID等字段。 2. 创建Java后端API:使用Spring Boot框架创建后端API,提供获取所有人、获取某个人、添加人等接口,通过JPA或MyBatis等框架操作数据库。 3. 创建Vue前端页面:使用Vue框架创建前端页面,包括家谱的展示、添加人、查找人等功能,使用axios等库调用后端API获取数据或提交数据。 以下是Java+Vue实现家谱前后端分离系统的示例代码: Java后端API: ```java @RestController @RequestMapping("/api") public class FamilyTreeController { @Autowired private PersonRepository personRepository; @GetMapping("/people") public List<Person> getAllPeople() { return personRepository.findAll(); } @GetMapping("/person/{id}") public Person getPerson(@PathVariable Long id) { return personRepository.findById(id).orElse(null); } @PostMapping("/person") public Person addPerson(@RequestBody Person person) { return personRepository.save(person); } } ``` Vue前端页面: ```html <template> <div> <h1>家谱</h1> <ul> <li v-for="person in people" :key="person.id"> {{ person.name }} <ul> <li v-for="child in getChildren(person)" :key="child.id"> {{ child.name }} </li> </ul> </li> </ul> <div> <h2>添加人</h2> <form @submit.prevent="addPerson"> <label>姓名:</label> <input type="text" v-model="newPerson.name"> <label>性别:</label> <select v-model="newPerson.gender"> <option value="male">男</option> <option value="female">女</option> </select> <label>父亲:</label> <select v-model="newPerson.fatherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <label>母亲:</label> <select v-model="newPerson.motherId"> <option v-for="person in people" :value="person.id" :key="person.id"> {{ person.name }} </option> </select> <button type="submit">添加</button> </form> </div> </div> </template> <script> import axios from 'axios'; export default { data() { return { people: [], newPerson: { name: '', gender: 'male', fatherId: null, motherId: null } } }, created() { this.loadPeople(); }, methods: { loadPeople() { axios.get('/api/people') .then(response => { this.people = response.data; }); }, getChildren(person) { return this.people.filter(p => p.fatherId == person.id || p.motherId == person.id); }, addPerson() { axios.post('/api/person', this.newPerson) .then(response => { this.people.push(response.data); this.newPerson = { name: '', gender: 'male', fatherId: null, motherId: null }; }); } } } </script> ``` 在上面的代码中,`FamilyTreeController`类是Java后端API的实现,提供获取所有人、获取某个人、添加人等接口。`vue`文件是Vue前端页面的实现,包括家谱的展示、添加人等功能。通过axios等库调用后端API获取数据或提交数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值