1:首先 npm install gm-crypt
npm install gm-crypt
2 下载 sm-crypto
npm install sm-crypto --save
3登入时先调用下
/**
* 随机生成字符串
* @param len 指定生成字符串长度
*/
export function getRandomString(len){
let min = 0, max = _charStr.length-1, _str = '';
//判断是否指定长度,否则默认长度为15
len = len || 15;
//循环生成字符串
for(var i = 0, index; i < len; i++){
index = RandomIndex(min, max, i);
_str += _charStr[index];
}
return _str;
}
随机生成一个16位的字符串
调用后端接口生成一个Key值
引入封装的加密方法
export var SMUtil = {
sm4Decode(key, context) {
const SM4 = require("gm-crypt").sm4;
const sm4Config = {
key: key,
mode: "ecb", // 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
cipherType: "base64" //
};
const sm4 = new SM4(sm4Config);
const decodeData = sm4.decrypt(context);
return decodeData;
},
sm4Encode(key, context) {
const SM4 = require("gm-crypt").sm4;
const sm4Config = {
key: key,
mode: "ecb", // 加密的方式有两种,ecb和cbc两种,也是看后端如何定义的,不过要是cbc的话下面还要加一个iv的参数,ecb不用
cipherType: "base64" //
};
const sm4 = new SM4(sm4Config);
const encryptData = sm4.encrypt(context);
return encryptData;
},
sm2Encode(pubKey, context) {
const sm2 = require('sm-crypto').sm2;
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
const encryptData = sm2.doEncrypt(context, pubKey, cipherMode) // 解密结果
return encryptData;
},
};
将key值和生成的字符串传入sm2Encode中
const secret = getRandomString(16);
const pubKey = await SecretAPI.getPublicKey();
this.loginForm.publicQKey = pubKey;
this.loginForm.secret = SMUtil.sm2Encode(pubKey,secret);
this.loginForm.password = SMUtil.sm4Encode(secret,this.loginForm.password);
this.$store.dispatch("GetDataSecret", secret);
将return出拉的secret传入sm4Encode中 此时加密完成
然后在请求拦截处
设置解密
res.data.data = JSON.parse(SMUtil.sm4Decode(store.getters.dataSecret,res.data.encodeData));
res.data.encodeData = '';
请求接口
import { RSAUtil } from "../utils/secret/rsa";
import { SMUtil } from "../utils/secret/sm.js";
import { getRandomString } from "../utils/index.js"
import constant from "../utils/constant";
import request from '../apis/config'
// import apiMod from '../api';
import {
BaseUrl_admin
// BaseUrl_CheckPic,
// BaseUrl_prient
} from "./baseFilePath";
// let basePrefixUrl = '/sys/common/secure';
// export function reqLogin({ userName, passWord }) {
// return axios.post(
// "/sys/web/login/loginWithPassword",
// {
// username: userName,
// password: passWord
// },
// {
// baseURL: BaseUrl_admin
// }
// );
// }
// export function reqLogin({ userName, passWord }) {
// return axios.post(
// "/sys/web/login/loginWithPassword",
// {
// username: userName,
// password: passWord
// },
// {
// baseURL: BaseUrl_admin
// }
// );
// }
export default {
async getPublicKey(){
const { data } = await request({
url: BaseUrl_admin + '/sys/common/secure/getPublicKey',
method: 'post'
});
return data;
},
async resetSecret(){
const { data } = await request({
url: BaseUrl_admin + '/sys/common/secure/getPublicKey',
method: 'post'
});
const secret = getRandomString(16);
const encodeSecret = SMUtil.sm2Encode(data,secret);
await request({
url: BaseUrl_admin + '/sys/common/secure/resetSecret',
method: 'post',
data: {
publicQKey: data,
secret: encodeSecret
}
});
return secret;
},
async getSecretKey() {
const keyPair = RSAUtil.getRSAKeyPair();
const localPubKey = keyPair.publicKey;
const localPrvKey = keyPair.privateKey;
let param = {
clientVersion: constant.clientInfo.clientVersion,
clientId: "xxx",
clientPublicKey: localPubKey
};
const { data } = await request({
url: BaseUrl_admin + '/getSecrteKey',
method: 'post',
data: param
});
if(data && data.dataSecret){
const encodeSecret = data.dataSecret;
const secretByte = RSAUtil.decode(encodeSecret, localPrvKey);
const secret = secretByte.toString("utf8");
return secret;
}
return null;
}
};