Postman通用接口加密解決方案

已發(fā)布至github,遠(yuǎn)程依賴即可使用十电,不用將腳本復(fù)制到本地

更加具體使用方式見:鏈接:https://github.com/iimondo/Postman-encryption

問(wèn)題

  1. postman內(nèi)置加密Api揭保,但不支持RSA加解密碼肥橙。如何用postman進(jìn)入rsa加解密?
  2. postman中request對(duì)象屬性皆為只讀秸侣,如何把提交時(shí)的明文變?yōu)槊芪?

解決問(wèn)題一

  • postman支持eval函數(shù)存筏,我們只要將rsa代碼存入環(huán)境變量中,在需要的時(shí)候調(diào)用eval函數(shù)就可以解決

解決問(wèn)題二

  • postman在每次請(qǐng)求時(shí)都會(huì)先執(zhí)行pre-request scripts 中的腳本味榛,在此處我們可以通過(guò)request對(duì)象拿到
    此次請(qǐng)求的參數(shù)椭坚,但request中的參數(shù)只可讀。
    所以我們只能通過(guò)環(huán)境變量去占位然后在去加密變量中的值搏色,于是在請(qǐng)求時(shí)的內(nèi)容就會(huì)變成加密的內(nèi)容善茎。
    針對(duì)postman對(duì){{}}讀取的方式,我們可以先在請(qǐng)求參數(shù)中將要加密的內(nèi)容包裹進(jìn)來(lái)频轿,然后在動(dòng)態(tài)創(chuàng)建此變量垂涯,
    并將變量的加密內(nèi)容寫入此環(huán)境變量中,最后在執(zhí)行請(qǐng)求完畢后將此變量清除

例子

AES加密參數(shù)
  1. 必需用{{}}將內(nèi)容包起來(lái)航邢,因?yàn)樵谶M(jìn)行請(qǐng)求后postman遇到{{}}時(shí)會(huì)從環(huán)境變量中讀取耕赘,如果有該環(huán)境變量則會(huì)動(dòng)態(tài)替換。
  2. $符號(hào)后面是我們要加密的內(nèi)容膳殷,可以直接填寫內(nèi)容或?qū)懭氕h(huán)境變量的名稱


    動(dòng)態(tài)生成的環(huán)境變量

    如果不想在環(huán)境變量夾中顯示動(dòng)態(tài)生成的環(huán)境變量可以將下方tests中的腳本加入到tests中

相關(guān)腳本

  • 注意:將腳本加入到collections中會(huì)更好
  • Pre-request Scripts
// ------ 通用方法 ------
// 提取{{}}中內(nèi)容
function getBracketStr(text) {
    let result = ''
    let regex = /\{\{(.+?)\}\}/g;
    let options = text.match(regex);
    if (options && options.length > 0) {
        let option = options[0];
        if (option) {
            result = option.substring(2, option.length - 2)
        }
    }
    
    return result
}


// ------ 導(dǎo)入RSA ------
if(!pm.globals.has("forgeJS")){
    pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", (err, res) => {
    if (!err) {
        pm.globals.set("forgeJS", res.text())
    }
})}

eval(postman.getGlobalVariable("forgeJS"));


// ------------ AES 加密 ------------
function aesEncrypt(content){
    //console.log('AES: ' + content);
    const key = CryptoJS.enc.Utf8.parse("Y5MUIOM7BUWI7BQR");
    const iv = CryptoJS.enc.Utf8.parse('S41AXIPFRFVJL73Z');
    const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
}


// ------------ RSA 加密 ------------
function rsaEncrypt(content){
    const pubKey = pm.environment.get("RSA_Public_Key");
    if(pubKey){
        const publicKey = forge.pki.publicKeyFromPem(pubKey);
        const encryptedText = forge.util.encode64(
            publicKey.encrypt(content, 'RSAES-PKCS1-V1_5', {
              md: forge.md.sha1.create(),
              mgf: forge.mgf.mgf1.create(forge.md.sha1.create())
        }));
        return encryptedText;
    }
}


// ------ 存儲(chǔ)所有未加密環(huán)境變量 ------
if(!pm.environment.has('localStore')){
    pm.environment.set('localStore', '{}');
}
let localStore = JSON.parse(pm.environment.get('localStore'));
// 獲取當(dāng)前請(qǐng)求中的加密變量
let requestData; 
if((typeof request.data) === 'string'){
    requestData = JSON.parse(request.data)
} else {
    requestData = request.data;
}

requestData = Object.assign(requestData, request.headers);
Object.keys(requestData).map(key => {
    let value = requestData[key] + ''; // 內(nèi)容
    if (value.indexOf('{{') !== -1) { // 是否為變量
        let content = getBracketStr(value);
        // 判斷是否加密
        if (content.indexOf('aes$') !== -1) {
            let c = content.split('aes$')[1];
            let encryptedContent = pm.environment.get(c); // 加密內(nèi)容
            encryptedContent = encryptedContent ? encryptedContent : c;
            pm.environment.set(content, aesEncrypt(encryptedContent));
            localStore[content] = aesEncrypt(encryptedContent);
        } else if (content.indexOf('rsa$') !== -1) {
            let c = content.split('rsa$')[1];
            let encryptedContent = pm.environment.get(c); // 加密內(nèi)容
            encryptedContent = encryptedContent ? encryptedContent : c;
            pm.environment.set(content, rsaEncrypt(encryptedContent));
            localStore[content] = rsaEncrypt(encryptedContent);
        }
    }
});

pm.environment.set('localStore', JSON.stringify(localStore));
  • Tests scripts
// 還原變量
if(!pm.environment.has('localStore')){
    pm.environment.set('localStore', '{}');
}
let localStore = JSON.parse(pm.environment.get('localStore'));
Object.keys(localStore).map(key => {
    pm.environment.unset(key)
});

pm.environment.unset('localStore')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末操骡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赚窃,更是在濱河造成了極大的恐慌册招,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勒极,死亡現(xiàn)場(chǎng)離奇詭異是掰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)辱匿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門冀惭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掀鹅,你說(shuō)我怎么就攤上這事∶铰ィ” “怎么了乐尊?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)划址。 經(jīng)常有香客問(wèn)我扔嵌,道長(zhǎng)限府,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任痢缎,我火速辦了婚禮胁勺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘独旷。我一直安慰自己署穗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布嵌洼。 她就那樣靜靜地躺著案疲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麻养。 梳的紋絲不亂的頭發(fā)上褐啡,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鳖昌,去河邊找鬼备畦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛许昨,可吹牛的內(nèi)容都是我干的懂盐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼车要,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允粤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起翼岁,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤类垫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后琅坡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悉患,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年榆俺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了售躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茴晋,死狀恐怖陪捷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诺擅,我是刑警寧澤市袖,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烁涌,受9級(jí)特大地震影響苍碟,放射性物質(zhì)發(fā)生泄漏酒觅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一微峰、第九天 我趴在偏房一處隱蔽的房頂上張望舷丹。 院中可真熱鬧,春花似錦蜓肆、人聲如沸颜凯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)装获。三九已至,卻和暖如春厉颤,著一層夾襖步出監(jiān)牢的瞬間穴豫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工逼友, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留精肃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓帜乞,卻偏偏與公主長(zhǎng)得像司抱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黎烈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容