奉上代码: node服务demo代码=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码
如果git登不上可以换gitee=》koa2-server项目代码;vue前端demo代码=》 vue-client项目代码
我查了(百度)下,用的比较多的加密是JSEncrypt,附上大佬的帖子=》RSA前端加密,crypto node-rsa Node后端解密
详细js文件地址=》node-rsa JSEncrypt的使用
公私钥生成
可以直接跳到下面看,这只是我记录我的探索过程的
刚开始,我使用openssl来生成rsa_public_key.pem、rsa_private_key.pem文件,下载地址:Win32OpenSSL,然后用fs读取pem文件代码如下,但是无法读取。最后直接使用了node-rsa模块,十分简单
const fs = require('fs')
const publicKey = fs.readFileSync('./rsa_public_key.pem').toString('utf-8')
const privateKey = fs.readFileSync('./rsa_private_key.pem').toString('utf-8')
console.log(publicKey) //公钥
console.log(privateKey) //私钥
node-rsa JSEncrypt模块使用
前端加密 JSEncrypt模块使用
JSEncrypt: https://www.npmjs.com/package/jsencrypt
signIn() {
this.publicKey()
},
async publicKey() {
// 获取加密公钥
const res = await this.$api.login.publicKey() // 公钥获取
if (res) {
const encrypt = new JSEncrypt()
encrypt.setPublicKey(res)
const encrypted = encrypt.encrypt(this.form.password) // 加密!!!只能加密字符串
this.$set(this.form, 'password', encrypted)
this.login()
}
},
async login() {
// 加密后登录
const res = await this.$api.login.login(this.form)
if (res) {
window.location.href = 'main.html'
}
}
signIn是登录按钮响应方法,先去后端获取公钥对密码进行加密,然后将密文传送后端解密
注意: encrypt.encrypt()只能加密字符串,其他的格式不行,所以最好加密前做一下类型转换
node解密 node-rsa模块使用
更多参数说明请看node-rsa: https://www.npmjs.com/package/node-rsa.
const mysql = require('../mysql');
const router = require('koa-router')();
const paramCheck = require('../tool/paramCheck');
const NodeRSA = require('node-rsa');
const key = new NodeRSA({ b: 1024 }); // 生成新的1024位长度密钥
key.setOptions({ encryptionScheme: 'pkcs1' }); // 用于加密的填充方法,可以为'pkcs1_oaep'、 'pkcs1'. 默认:'pkcs1_oaep'。但是改成'pkcs1_oaep'解密会出错
router.prefix('/security');
router.post('/login', async (ctx, next) => {
const requestParam = ['name', 'password'];
const user = ctx.request.body;
if (paramCheck.check(user, requestParam) !== true) {
ctx.error([0, paramCheck.check(user, requestParam)]);
} else {
const password = user.password.replace(/\s+/g, '+'); // 防止公钥有空格存在
user.password = key.decrypt(password, 'utf8'); // 解密
// eslint-disable-next-line quotes
const sql = "select * from `user` where `name`='" + user.name + "' and `password`='" + user.password + "'";
const result = await mysql.query(sql);
if (result[0] && result[0].is_cancel === 0) {
ctx.success(true);
} else {
ctx.error([0, '用户名或密码错误']);
}
}
});
// 加密公钥获取
router.get('/publicKey', async (ctx, next) => {
const publicKey = key.exportKey('public'); // 生成公钥
ctx.success(publicKey);
});
module.exports = router;
这样前端加密,node后端解密就做好了
效果
获取公钥
加密后登录
页面效果
这样登录就搞定了,后面弄下token,退出等功能
上一篇:node从入门到放弃系列之(5)mysql同步操作及登录接口demo
下一篇:node从入门到放弃系列之(7)token令牌生成、验证、注销