一、前端加密
前端安装crypto-js
npm install crypto-js --save
封装加密方法
import CryptoJS from 'crypto-js' --引入js
import { SECRETKEY } from '../config/secret' --引入加密的密匙
采用AES对称加密方法:
/**
* 加密函数,加密同一个字符串生成的都不相同
* @param {*} str
*/
export function encrypt(str) {
return CryptoJS.AES.encrypt(JSON.stringify(str), SECRETKEY).toString();
}
/**
* 解密函数
* @param {*} str
*/
export function decrypt(str) {
const bytes = CryptoJS.AES.decrypt(str, SECRETKEY);
return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
}
使用,引入刚才创建的这个加密的方法
import { encrypt } from "../../../utils/util";
onSubmit = () => {
this.props.form.validateFields((errors, values) => {
if (!errors) {
//this.onLogin(values)
values.password = encrypt(values.password); --进行加密
this.post(`${this.api.login.login}`, values).then((res) => {
if (res.data.code == 200) {
message.success(res.data.message);
sessionStorage.setItem("blogUser", values.username);
sessionStorage.setItem("menuItmeKey", "0");
const action = updateinfo(res.data.data);
store.dispatch(action);
sessionStorage.setItem("token",res.data.token);
}else{
message.warning(res.data.message);
}
}).catch((res)=>{
message.warning(res.data.message);
});
}
});
}
二、koa后端进行解密再加密存储到数据库
后端也需要安装crypto-js,方法痛前端一样,
不过koa是基于commonjs的语法,因此使用上不能用es6的语法
let passwd = tool.decrypt(query.password); --进行解密操作,当然解密的密匙要跟前端一致
1、一般用node写后端的话,这直接写一个中间件即可
安装 npm install cryptp --save
首先我们肯定要封装一个加密的文件,我们命名为password-handle.js
const crypto = require('crypto');
const md5password = (password) => {
const md5 = crypto.createHash('md5');
const result = md5.update(password).digest('hex'); //hex表示拿到最终为十六进制
return result;
}
module.exports = md5password;
2、然后创建我们的中间件,命名为auth_middleware.js
const md5password = require('../utils/password-handle');
const handlePassword = async (ctx,next) =>{
let { password } = ctx.request.body;
ctx.request.body.password = md5password(password);
await next();
}
module.exports = {
handlePassword
}
使用
const UserModule = require('../modules/users')
const md5password = require("../utlis/password-handle");
const jwt = require("jsonwebtoken")
const keys = require("../config/keys")
const tool = require("../utlis/index");
class UserControler {
static async adduser(ctx) { //注册
const query = ctx.request.body;
let passwd = tool.decrypt(query.password); --解密操作
query.password = md5password(passwd); --重新加密
try {
let sqlt = {
username: query.username,
};
const result = await UserModule.userLogin(sqlt);
if (result.length > 0) {
ctx.response.status = 200;
ctx.body = {
code: 201,
message: "该用户已存在,请勿重复注册",
};
} else {
const data = await UserModule.addUsers(query);
if (data) {
const payload = {
userNumber: data.username,
time: new Date().getTime(),
timeout: 1000 * 60 * 60 * 2,
};
const token = jwt.sign(payload, keys.secretOrkey, {
expiresIn: 3600,
});
ctx.response.status = 200;
ctx.body = {
code: 200,
token: token,
data: {
username: data.username,
user_id: data.user_id,
roleType: data.roleType,
token: token,
},
message: "登陆成功",
};
} else {
ctx.response.status = 200;
ctx.body = {
code: 400,
message: "注册失败",
};
}
}
} catch (err) {
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: "error",
err,
};
}
}
}