postman 中間: インターフェイスの暗号化と復号化の処理 AES SM3 SM4

推奨される読書対象: postman の基本的な使用法をマスターし、JavaScript について少し知っている
ローカルにインストールされた Postman のバージョン: バージョン 9.15.11

1 はじめに

プロジェクトのすべてのインターフェイスが暗号化されていたため、以前に作成したインターフェイス自動化スクリプトが実行できなくなり、長い間心配していました。私はついに黙っていられなくなり、この暗号化と復号化の問題を解決しなければならないと決心しました。フロントエンドの暗号化と復号化の js スクリプトを取り出した後、最終的にデバッグが完了するまでに 1 日かかりました。これで、自動化のユースケースが再び実行できるようになりました。
注: 企業やプロジェクトが異なれば、暗号化と復号化のロジックや方法も異なります。以下は主に postman での暗号化と復号化の処理方法を示す例であり、特定のコードをコピーすることはできず、実際の状況に応じて調整する必要があります。しかし、アイデアを理解した後は、その他のことはすべて小さなケースです。

2. インターフェイスの暗号化および復号化ロジック

特定のプロジェクトのインターフェイス暗号化および復号化ロジックを説明するために例を示します。そうしないと、次のスクリプトの理解に逸脱が生じる可能性があります。
暗号化前の入力パラメータ:

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

暗号化された入力パラメータ:

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

暗号化ロジック:
SM3 は、署名とトークンなしで事前に暗号化された入力パラメータを暗号化し、暗号化された署名を取得します。暗号化された srcsign を事前に暗号化された署名に
置き換え、入力パラメータ全体に対して SM4 暗号化を実行して、暗号化されたデータを取得します。暗号化された srcdata は
、暗号化されていないデータを送信し、リクエストを開始します。

復号化ロジック:
srcdata に対して SM4 復号化を実行すれば問題ありません。

3. ポストマンの暗号化と復号化処理の考え方

//上記の例の暗号化および復号化ロジックを例に挙げます。

3.1 環境変数の設定

ここに画像の説明を挿入

url: 環境変数で手動で設定されたテスト アドレス。実際のインターフェイスは動的変数形式 { {url}} を使用して呼び出します。これは、環境を切り替えるのに便利です。
token: 環境変数に手動で追加するか、[トークンを取得するインターフェイス] をリクエストして環境変数として自動的に設定できます; (通常は動的ですが、暗号化を処理するときに変数を参照する方が便利です)
Sign_key: 署名key、環境変数に手動で設定されます Medium (開発が必要)
data_key: 暗号化キー、環境変数に手動で設定されます (開発が必要)

srcsign: 暗号化された署名。[事前リクエスト スクリプト] での処理後に環境変数に自動的に追加されます。サービスインターフェースがリクエストされるたびに、現在値[CURRENT VALUE]が自動的に更新されます。
srcdata: 暗号化された入力パラメータのデータは、[リクエスト前スクリプト]で処理された後、環境変数に自動的に追加されます。サービスインターフェースがリクエストされるたびに、現在値[CURRENT VALUE]が自動的に更新されます。

3.2 暗号化・復号化アルゴリズム file.js の準備

1. 暗号化・復号化アルゴリズムをjsフォルダにカプセル化し、署名暗号化機能、SM4暗号化機能、SM4復号化機能の3つの機能を提供します。
(私のようにコードの書き方がわからない場合は、フロントエンドの同僚にコードを書くのを手伝ってもらってください。結局のところ、彼らは既製のものを持っているので、それをファイルに整理するだけです) 2. js 内のコードをコピーします。ファイルを [Pre-request Script] 、 [Tests] に直接コピーします。(JS コードを理解していない場合は、最適化について考えず、コードをすべてコピーして貼り付けてください。使用するときは、参照関数、アサーションなどの独自のスクリプトを直後に追加してください。)

3.3 リクエストボディ内の参照変数

暗号化された入力パラメータを[リクエストボディ]にコピーし、暗号化部分(srcsign、srcdata)とトークンを動的パラメータに変更し、環境変数を参照します次のように:

{
    
    
    "appid": "###########",
    "token": "{
    
    {token}}",
    "srcsign": "{
    
    {srcsign}}",
    "srcdata": "{
    
    {srcdata}}"
}
3.4 [リクエスト前スクリプト]の入力パラメータを暗号化する
//使用说明:修改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 [テスト]のパラメータを復号化する
//使用说明:去环境变量中修改 加密密钥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. コンソールパネル: 印刷された情報を表示します。

以上が暗号化・復号処理スクリプトの記述であり、リクエスト送信後、コンソールパネルに出力された「暗号化データ」「復号データ」等の情報を確認することができます。おそらく次のようなものでしょう:

5. 最適化1:暗号化・復号化algorithm.jsのコードをグローバル変数として設定

上記のように、処理と復号化はすでに実現できています。ただし、暗号化と復号のアルゴリズムはすべて[Pre-request Script]と[Tests]に入れられており、保守性は悪いです。
欠点:
1. アルゴリズム コードが非常に長い場合、独自のスクリプトを追加するときに一番下までプルダウンする必要があり、操作が不便です; 2.
アルゴリズム コードが変更された場合、[事前リクエスト] に移動する必要があります。各インターフェースの「スクリプト」と「テスト」が更新されます。インターフェイスが多数ある場合、作業負荷がわかります。

最適化スキーム: 暗号化および復号化アルゴリズムをグローバル変数として設定し、[リクエスト前スクリプト]および[テスト]で変数を取得し、eval()関数を通じて関連コードを実行します。

5.1 グローバル変数の設定

ここに画像の説明を挿入

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

6. 最適化 2: 暗号化および復号化のアルゴリズム.js ファイルを Tomcat に配置し、それを参照します

具体的な操作については、Postman による外部 js ファイルのインポートを参照してください。

何か間違っている場合は、お知らせください。ありがとうございます。

おすすめ

転載: blog.csdn.net/weixin_48415452/article/details/124298717