模拟前端密码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