Postman 请求自动 SM2/SM4 加解密

添加新包

  1. 打开 HTTP 请求、集合、或者文件夹,然后选择 Scripts选项。
  2. 选择 Pre-requestPost-response 选项。
  3. 打开代码编辑器右侧的窗口,然后选择 Open package libraryimage.png

SM2 加解密

  1. 选择 New package
  2. 输入包名:sm2
  3. 代码粘贴到窗口中。
  4. 选择 Create

SM4 加解密

  1. 选择 New package
  2. 输入包名:sm4utils
  3. 代码粘贴到窗口中。
  4. 选择 Create

添加环境变量

  1. 选择右侧按钮,选择 Addimage.png
  2. 在打开的窗口中添加变量sm4keysm2key内容为 SM4 密钥、SM2密钥。
  3. 选择 Save
  4. 右上角选择设置的环境变量。
    image.png

编写脚本

代码仅为演示,请根据自己的业务需求编写代码。

  1. 打开 HTTP 请求,然后选择 Scripts选项。
  2. 选择 Pre-request 选项,添加如下代码:
const sm2 = pm.require('sm2')

// 当 body 类型为 json 时,从 pm.request.body.raw 获取请求参数
try {
    var jsonData = JSON.parse(pm.request.body.raw)

    // 获得当前时间
    var date = new Date()
    const year = String(date.getFullYear())
    const month = String(date.getMonth() + 1).padStart(2, "0")
    const day = String(date.getDate()).padStart(2, "0")
    const hour = String(date.getHours()).padStart(2, "0")
    const minute = String(date.getMinutes()).padStart(2, "0")
    const second = String(date.getSeconds()).padStart(2, "0")

    var dateStr = `${year}${month}${day}${hour}${minute}${second}`

    // 请求参数设置时间
    jsonData.askTime = dateStr

    // 存储 SM4 密钥
    pm.environment.set('sm4key', jsonData.symmetricKey)

    // 1 - C1C3C2,0 - C1C2C3,默认为 1
    const cipherMode = 0
    // 获得 SM2 公钥
    var key = pm.environment.get("sm2key");

    var content = JSON.stringify(jsonData)
    // SM2 加密
    var encryptData = sm2.doEncrypt(content, key, cipherMode)

    // 添加 04 开头
    encryptData = '04' + encryptData
    // 更新请求体
    pm.request.body = encryptData

} catch (e) {
    console.log(e);
}

const sm4 = pm.require('sm4utils')
// 加密 body
var encryptBody = sm4.encrypt(String(pm.request.body), pm.environment.get("sm4key"));
// 更新请求体
pm.request.body = encryptBody;
  1. 选择 Post-response选项,添加如下代码:
const sm4 = pm.require('sm4utils')

const jsonResult = pm.response.json()
var decryptBody

if (jsonResult.code != 2000) {
    decryptBody = jsonResult.msg

} else {
    // 保存 token
    pm.environment.set('access_token', jsonResult.access_token)

    // 解密接口返回的加密参数
    decryptBody = sm4.decrypt(String(jsonResult.encryptDatas), pm.environment.get("sm4key"))
}

// 将接口返回数据,封装成自己需要的结构
var resp = {
    response: decryptBody
}
// html 模板字符
var template = `<head>
    <style>
        pre {
            outline: 1px solid #ccc;
            padding: 5px;
            margin: 5px;
        }

        .string {
            color: green;
        }

        /*字符串的样式*/
        .number {
            color: darkorange;
        }

        /*数字的样式*/
        .boolean {
            color: blue;
        }

        /*布尔型数据的样式*/
        .null {
            color: magenta;
        }

        /*null值的样式*/
        .key {
            color: red;
        }

        /*key值的样式*/
    </style>
</head>

<body>
    <pre id="result">嘿嘿</pre>

    <script>
        function syntaxHighlight(json) {

            json = json.replaceAll('&quot;', '"');

            try {
                json = JSON.parse(json)
            } catch (e) {
                console.log(json)
                json = '{"msg":"' + json + '"}'
            }
            if (typeof json != 'string') {
                json = JSON.stringify(json, undefined, 2);
            }
            json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
            return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
                function (match) {
                    var cls = 'number';
                    if (/^"/.test(match)) {
                        if (/:$/.test(match)) {
                            cls = 'key';
                        } else {
                            cls = 'string';
                        }
                    } else if (/true|false/.test(match)) {
                        cls = 'boolean';
                    } else if (/null/.test(match)) {
                        cls = 'null';
                    }
                    return '<span class="' + cls + '">' + match + '</span>';
                }
            );
        }

        document.getElementById("result").innerHTML = syntaxHighlight('{{response}}');
    </script>
</body>`;

// 设置 visualizer 数据。传模板、解析对象。
pm.visualizer.set(template, resp)

发送请求

Body中填写加密前的 json 参数即可。
image.png
Visualize 中可以看到将 encryptDatas解密后的 json 数据。
image.png
image.png

参考

sm-crypto
后端生成的密钥对,前端加密成功,但无法解密
在html页面中展示JSON
响应数据可视化
脚本读取/修改接口请求信息

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值