模拟前端密码js加密,后端测试时使用
使用goja
目录
遇到的问题:
1、js代码报错,调试js 代码
Visual Studio Code 中安装code runner插件
安装node
修改vs code配置settings.json 中增加行
"code-runner.runInTerminal":true,
"code-runner.executorMap":{ "javascript": "D:\\\\tools\\nodejs\\node.exe", },
2、前端加密js使用jsencrypt,遇到问题
https://github.com/travist/jsencrypt.git
遇到问题:
1)bin目录下文件jsencrypt.min.js,会报错 不支持window对象
使用https://studygolang.com/articles/35387?fr=sidebar
修改的文件。
3、import 或 require 报错。
支持的js 语法目前只支持require。同时要增加下面的注册
registry := new(require.Registry)
registry.Enable(vm)
import (
"fmt"
"os"
"encoding/base64"
"github.com/dop251/goja"
"github.com/dop251/goja_nodejs/require"
"github.com/wumansgy/goEncrypt"
)
func JsDoEncrypt(inV string) (outEncV string, err error) {
var script = `
function GenEnc(inV, pubKey) {
const jsencrypt = require('./jsencrypt.min.js');
let encrypt = new jsencrypt.JSEncrypt();
encrypt.setPublicKey(pubKey);
return encrypt.encrypt(inV);
}
`
//
vm := goja.New()
registry := new(require.Registry)
registry.Enable(vm)
_, err = vm.RunString(script)
if err != nil {
// global.G_LOG.Info("[%s]JS代码有问题",w.TraceId)
fmt.Println("JS代码有问题")
return
}
var fn func(string, string) string
err = vm.ExportTo(vm.Get("GenEnc"), &fn)
if err != nil {
fmt.Println("Js函数映射到 Go 函数失败!")
return
}
//
file, err := os.Open("public.pem")
if err != nil {
fmt.Println("open publicKey file err:", err)
return
}
defer file.Close()
//获取文件内容
info, _ := file.Stat()
buf := make([]byte, info.Size())
file.Read(buf)
//
outEncV = fn(inV, string(buf))
// fmt.Println("加密后为:", outEncV)
return
}
参考文章:
https://www.cnblogs.com/ZYSZBD/p/14929855.html
https://studygolang.com/articles/35387?fr=sidebar