Cartero intermedio: interfaz de procesamiento de cifrado y descifrado AES SM3 SM4

Objetivo de lectura sugerido: Dominar el uso básico de cartero y conocer un poco de JavaScript
Versión de cartero instalada localmente: Versión 9.15.11

1. Introducción

Dado que todas las interfaces del proyecto estaban encriptadas, estuve preocupado durante mucho tiempo porque el script de automatización de la interfaz escrito antes no podía ejecutarse. Finalmente no pude quedarme quieto y decidí que este problema de cifrado y descifrado debía resolverse. Después de desenterrar el script js de cifrado y descifrado front-end, tomó 1 día para finalmente completar la depuración, y ahora mi caso de uso de automatización puede ejecutarse nuevamente.
Nota: Diferentes empresas y diferentes proyectos tienen diferentes lógicas y métodos de cifrado y descifrado. El siguiente es principalmente un ejemplo para ilustrar cómo manejar el cifrado y descifrado en cartero. El código específico no debe copiarse y debe ajustarse de acuerdo con la situación real. Sin embargo, después de captar la idea, todo lo demás es un caso menor.

2. Lógica de cifrado y descifrado de interfaz

Permítanme dar un ejemplo para ilustrar la lógica de cifrado y descifrado de la interfaz de un determinado proyecto, de lo contrario, puede haber desviaciones en la comprensión de los siguientes scripts.
Parámetros de entrada antes del cifrado:

{
    
    
    "data": {
    
     ... },
    "appid": "###########",
    "token": "###########",
    "sign": "###########"
}

Parámetros de entrada encriptados:

{
    
    
    "srcdata": {
    
     ... },
    "appid": "###########",
    "token": "###########",
    "srcsign": "###########"
}

Lógica de cifrado:
SM3 cifra los parámetros de entrada precifrados sin signo ni token para obtener el signo cifrado;
reemplace el srcsign cifrado con el signo precifrado y realice el cifrado SM4 en todos los parámetros de entrada para obtener datos cifrados
; El srcdata cifrado reemplaza los datos no cifrados y luego inicia una solicitud.

Lógica de descifrado:
realice el descifrado SM4 en srcdata, y estará bien.

3. La idea del cartero de procesar el cifrado y descifrado

//Tome la lógica de cifrado y descifrado del ejemplo anterior como ejemplo:

3.1 Configuración de variables de entorno

inserte la descripción de la imagen aquí

url: dirección de prueba, configurada manualmente en la variable de entorno, y la interfaz real utiliza la forma de variable dinámica { {url}} para llamar, lo cual es conveniente para cambiar de entorno.
token: agregado manualmente a la variable de entorno, o puede solicitar [la interfaz para obtener el token] y configurarlo automáticamente como una variable de entorno ; (generalmente dinámico, es más conveniente referirse a la variable al procesar el cifrado)
sign_key: firma clave, configurada manualmente en la variable de entorno Medio (necesidad de desarrollo)
data_key: clave de cifrado, configurada manualmente en la variable de entorno (necesidad de desarrollo)

srcsign: la firma cifrada, que se agrega automáticamente a la variable de entorno después del procesamiento en [Script de solicitud previa]. Cada vez que se solicite una interfaz de servicio, el valor actual [VALOR ACTUAL] se actualizará automáticamente.
srcdata: los datos en el parámetro de entrada encriptada se agregan automáticamente a la variable de entorno después de procesarse en [Script de solicitud previa]. Cada vez que se solicite una interfaz de servicio, el valor actual [VALOR ACTUAL] se actualizará automáticamente.

3.2 Preparar archivo de algoritmo de cifrado y descifrado.js

1. Encapsule el algoritmo de cifrado y descifrado en una carpeta js y proporcione 3 funciones: función de cifrado de firma, función de cifrado SM4 y función de descifrado SM4. (Si no sabe cómo escribir código como yo, pídales a sus colegas de front-end que lo ayuden a escribirlo. Después de todo, tienen códigos listos para usar, solo organícelos en un archivo) 2. Copie el código en
js archivo directamente a [Pre-solicitud de secuencia de comandos], [Pruebas]. (Si no entiende el código js, ​​no piense en optimizarlo, simplemente cópielo y péguelo todo. Cuando lo use, agregue sus propios scripts directamente detrás, como: funciones de referencia, afirmaciones, etc.)

3.3 Variables de referencia en el cuerpo de la solicitud

Copie los parámetros de entrada cifrados en [cuerpo de solicitud], luego cambie las partes cifradas (srcsign, srcdata) y el token en parámetros dinámicos y consulte las variables de entorno . como sigue:

{
    
    
    "appid": "###########",
    "token": "{
    
    {token}}",
    "srcsign": "{
    
    {srcsign}}",
    "srcdata": "{
    
    {srcdata}}"
}
3.4 Cifrar los parámetros de entrada en [Script de solicitud previa]
//使用说明:修改reqt_json即可,其他代码不要动

//1、将加密前的入参reqt_json复制粘贴到[Pre-request Script]中
//注意:不含sign、token
reqt_json = {
    
    
    "data": {
    
     ... },
    "appid": "###########"
}
//2、获取环境变量中的token,拼接到reqt_json中,作为待加密的签名报文;
token = pm.environment.get("token");
reqt_json.token= token
console.log(reqt_json)

//----------此处为js文件内的代码,就不展示出来啦----------

console.log('------------前置处理:加密开始------------')
//3、环境变量中去读取sign_key
sign_key = pm.environment.get("sign_key");
//引用加密函数,对sing加密
const signData = sign(reqt_json, sign_key)
//将加密后的签名设置为环境变量
pm.environment.set("srcsign", signData);

//4、环境变量中去读取data_key
data_key = pm.environment.get("data_key");
//将加密后的srcsign拼接到reqt_json中,作为待加密的data报文;
reqt_json.srcsign= signData
data = reqt_json
//引用加密函数,对data加密
const encryptSM4Data = encryptSM4(data, data_key)
console.log("加密后的data为:")
console.log(encryptSM4Data)
//将加密后的data设置为环境变量
pm.environment.set("srcdata", encryptSM4Data);
console.log('------------前置处理:加密结束------------')
//到此,入参加密就处理完了。send的时候,会自动先执行预处理脚本,
//然后发起请求时request boy中的变量取环境变量中的值,就可以成功。
3.5 Descifrar los parámetros en [Pruebas]
//使用说明:去环境变量中修改 加密密钥sign_key、data_key
   
//----------此处为js文件内的代码,就不展示出来啦----------

console.log('----------------------后置处理:解密开始------------------')
//1、从环境变量中获取加密密钥data_key
data_key = pm.environment.get("data_key");
var JSdata =JSON.parse(responseBody);
//console.log(JSdata.chs_fjs_encdata)
//2、引用[SM4解密函数],得到解密后的data,就是解密后的完整出参啦;
const decdata = decryptSM4(JSdata.chs_fjs_encdata, data_key)
console.log('解密后的data为:')
console.log(decdata)

//3、加个断言,判断下解密后的出参中是否code=0 (以接口的实际标志为准)
if(decdata.code === "0")
    {
    
    
        tests["用例执行成功(code为0)"] = true;
      }
else{
    
    
    tests["用例执行失败:"+responseBody] = false;
}
console.log('----------------------后置处理:解密完成------------------')
//到此,解密就结束啦。不用怀疑,真的就是这样处理而已。

4. Panel de la consola: ver la información impresa

Arriba, se escribe el script de procesamiento de cifrado y descifrado. Después de enviar la solicitud, puede ver los [datos cifrados], [datos descifrados] y otra información que imprimimos en el panel de la consola . Probablemente algo como esto:

5. Optimización 1: establezca el código en el algoritmo de cifrado y descifrado.js como una variable global

Como se indicó anteriormente, el procesamiento y el descifrado ya se pueden lograr. Sin embargo, los algoritmos de cifrado y descifrado se colocan en [Script de solicitud previa] y [Pruebas], y la capacidad de mantenimiento es deficiente.
Desventajas:
1. Si el código del algoritmo es muy largo, debe bajar hasta el final al agregar su propio script, lo cual es un inconveniente para operar
2. Si se cambia el código del algoritmo, debe ir a [Solicitud previa Script] y [Pruebas] de cada interfaz renovada. Si hay muchas interfaces, se puede ver la carga de trabajo.

Esquema de optimización: configure el algoritmo de cifrado y descifrado como una variable global, obtenga la variable en [Script de solicitud previa] y [Pruebas], y luego ejecute el código relevante a través de la función eval().

5.1 Configuración de variables globales

inserte la descripción de la imagen aquí

5.2 Ejecución usando la función eval()
console.log('----------------------执行算法代码------------------------------')
//将算法文件存放到全局变量中去(字符串形式),然后获取变量suanfa的值,再通过eval()函数将字符串转换为代码执行
eval(postman.getGlobalVariable("suanfa"));

6. Optimización 2: coloque el archivo de cifrado y descifrado algoritmo.js en tomcat y luego haga referencia a él

Para operaciones específicas, consulte: Postman importa archivos js externos

Si hay algo mal, por favor hágamelo saber, ¡gracias!

Supongo que te gusta

Origin blog.csdn.net/weixin_48415452/article/details/124298717
Recomendado
Clasificación