facteur intermédiaire : interface de traitement chiffrement et déchiffrement AES SM3 SM4

Cible de lecture suggérée : Maîtriser l'utilisation de base de postman et connaître un peu JavaScript
Version de Postman installée localement : Version 9.15.11

1. Introduction

Comme toutes les interfaces du projet étaient cryptées, j'ai longtemps été inquiet, car le script d'automatisation d'interface écrit auparavant ne pouvait pas s'exécuter. Je ne pouvais finalement pas rester assis et j'ai décidé que ce problème de cryptage et de décryptage devait être résolu. Après avoir creusé le script js de chiffrement et de déchiffrement frontal, il a fallu 1 jour pour enfin terminer le débogage, et maintenant mon cas d'utilisation d'automatisation peut s'exécuter à nouveau.
Remarque : Différentes entreprises et différents projets ont une logique et des méthodes de chiffrement et de déchiffrement différentes. Ce qui suit est principalement un exemple pour illustrer comment gérer le chiffrement et le déchiffrement dans postman.Le code spécifique ne doit pas être copié, et il doit être ajusté en fonction de la situation réelle. Cependant, après avoir saisi l'idée, tout le reste est un petit cas.

2. Logique de chiffrement et de déchiffrement de l'interface

Permettez-moi de donner un exemple pour illustrer la logique de chiffrement et de déchiffrement de l'interface d'un certain projet, sinon il peut y avoir des écarts dans la compréhension des scripts suivants.
Paramètres d'entrée avant chiffrement :

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

Paramètres d'entrée chiffrés :

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

Logique de chiffrement :
SM3 chiffre les paramètres d'entrée préchiffrés sans signe ni jeton pour obtenir le signe chiffré ;
remplacez le srcsign chiffré par le signe préchiffré et effectuez le chiffrement SM4 sur l'ensemble des paramètres d'entrée pour obtenir des données chiffrées
 ; Le srcdata chiffré remplace les données non chiffrées, puis lance une requête.

Logique de décryptage :
effectuez le décryptage SM4 sur srcdata, et tout ira bien.

3. L'idée du facteur de traiter le cryptage et le décryptage

//Prenez comme exemple la logique de chiffrement et de déchiffrement de l'exemple ci-dessus :

3.1 Configuration des variables d'environnement

insérez la description de l'image ici

url : adresse de test, configurée manuellement dans la variable d'environnement, et l'interface réelle utilise la forme de variable dynamique { {url}} pour appeler, ce qui est pratique pour changer d'environnement.
jeton : ajouté manuellement à la variable d'environnement, ou vous pouvez demander [l'interface pour obtenir le jeton] et le définir automatiquement en tant que variable d'environnement ; (généralement dynamique, il est plus pratique de se référer à la variable lors du traitement du chiffrement)
sign_key : signature key, configurée manuellement dans la variable d'environnement Medium (besoin de développement)
data_key : clé de chiffrement, configurée manuellement dans la variable d'environnement (besoin de développement)

srcsign : La signature chiffrée, qui est automatiquement ajoutée à la variable d'environnement après traitement dans [Script de pré-demande]. Chaque fois qu'une interface de service est demandée, la valeur actuelle [CURRENT VALUE] sera automatiquement mise à jour.
srcdata : les données du paramètre d'entrée chiffré sont automatiquement ajoutées à la variable d'environnement après avoir été traitées dans [Script de pré-demande]. Chaque fois qu'une interface de service est demandée, la valeur actuelle [CURRENT VALUE] sera automatiquement mise à jour.

3.2 Préparer l'algorithme de chiffrement et de déchiffrement file.js

1. Encapsulez l'algorithme de chiffrement et de déchiffrement dans un dossier js et fournissez 3 fonctions : fonction de chiffrement de signature, fonction de chiffrement SM4 et fonction de déchiffrement SM4. (Si vous ne savez pas comment écrire du code comme moi, demandez à des collègues frontaux de vous aider à l'écrire. Après tout, ils en ont des prêts à l'emploi, organisez-les simplement dans un fichier) 2. Copiez le code dans le
js déposer directement dans [Script de pré-demande] , [Tests]. (Si vous ne comprenez pas le code js, ne pensez pas à l'optimiser, copiez et collez simplement le tout. Lorsque vous l'utilisez, ajoutez vos propres scripts directement derrière, tels que : fonctions de référence, assertions, etc.)

3.3 Variables de référence dans le corps de la requête

Copiez les paramètres d'entrée chiffrés dans [corps de la requête], puis modifiez les parties chiffrées (srcsign, srcdata) et le jeton en paramètres dynamiques, et faites référence aux variables d'environnement . comme suit:

{
    
    
    "appid": "###########",
    "token": "{
    
    {token}}",
    "srcsign": "{
    
    {srcsign}}",
    "srcdata": "{
    
    {srcdata}}"
}
3.4 Crypter les paramètres d'entrée dans [Script de pré-demande]
//使用说明:修改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 Décrypter les paramètres dans [Tests]
//使用说明:去环境变量中修改 加密密钥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. Panneau de la console : afficher les informations imprimées

Ci-dessus, le script de traitement de cryptage et de décryptage est écrit. Après avoir envoyé la demande, vous pouvez afficher les [données cryptées], [données décryptées] et d'autres informations que nous avons imprimées dans le panneau de la console . Probablement quelque chose comme ça :

5. Optimisation 1 : Définir le code dans l'algorithme de chiffrement et de déchiffrement.js en tant que variable globale

Comme précédemment, le traitement et le déchiffrement peuvent déjà être réalisés. Cependant, les algorithmes de chiffrement et de déchiffrement sont tous placés dans [Pre-request Script] et [Tests], et la maintenabilité est médiocre.
Inconvénients :
1. Si le code de l'algorithme est très long, vous devez tirer vers le bas lors de l'ajout de votre propre script, ce qui est peu pratique à utiliser ;
2. Si le code de l'algorithme est modifié, vous devez vous rendre dans [Pré-demande Script] et [Tests] de chaque interface se renouvellent. S'il y a beaucoup d'interfaces, la charge de travail peut être vue.

Schéma d'optimisation : définissez l'algorithme de chiffrement et de déchiffrement en tant que variable globale, obtenez la variable dans [Script de pré-requête] et [Tests], puis exécutez le code approprié via la fonction eval().

5.1 Paramètres des variables globales

insérez la description de l'image ici

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

6. Optimisation 2 : placez le fichier algorithm.js de chiffrement et de déchiffrement dans tomcat puis référencez-le

Pour des opérations spécifiques, veuillez vous référer à : Postman importe des fichiers js externes

S'il y a quelque chose qui ne va pas, s'il vous plaît faites le moi savoir, merci!

Je suppose que tu aimes

Origine blog.csdn.net/weixin_48415452/article/details/124298717
conseillé
Classement