1. 程式人生 > >Jmeter——使用JSR223元件實現RSA登入加密

Jmeter——使用JSR223元件實現RSA登入加密

一、RSA加密簡介

  RSA加密是一種非對稱加密。可以在不直接傳遞金鑰的情況下,完成解密。這能夠確保資訊的安全性,避免了直接傳遞金鑰所造成的被破解的風險。是由一對金鑰來進行加解密的過程,分別稱為公鑰和私鑰。兩者之間有數學相關,該加密演算法的原理就是對一極大整數做因數分解的困難性來保證安全性。通常個人儲存私鑰,公鑰是公開的(可能同時多人持有)。

二、RSA加密、簽名區別

  加密和簽名都是為了安全性考慮,但略有不同。常有人問加密和簽名是用私鑰還是公鑰?其實都是對加密和簽名的作用有所混淆。簡單的說,加密是為了防止資訊被洩露,而簽名是為了防止資訊被篡改。這裡舉2個例子說明。

第一個場景:戰場上,B要給A傳遞一條訊息,內容為某一指令。

RSA的加密過程如下:

(1)A生成一對金鑰(公鑰和私鑰),私鑰不公開,A自己保留。公鑰為公開的,任何人可以獲取。

(2)A傳遞自己的公鑰給B,B用A的公鑰對訊息進行加密。

(3)A接收到B加密的訊息,利用A自己的私鑰對訊息進行解密。

  在這個過程中,只有2次傳遞過程,第一次是A傳遞公鑰給B,第二次是B傳遞加密訊息給A,即使都被敵方截獲,也沒有危險性,因為只有A的私鑰才能對訊息進行解密,防止了訊息內容的洩露。

第二個場景:A收到B發的訊息後,需要進行回覆“收到”。

RSA簽名的過程如下:

(1)A生成一對金鑰(公鑰和私鑰),私鑰不公開,A自己保留。公鑰為公開的,任何人可以獲取。

(2)A用自己的私鑰對訊息加簽,形成簽名,並將加簽的訊息和訊息本身一起傳遞給B。

(3)B收到訊息後,在獲取A的公鑰進行驗籤,如果驗簽出來的內容與訊息本身一致,證明訊息是A回覆的。

  在這個過程中,只有2次傳遞過程,第一次是A傳遞加簽的訊息和訊息本身給B,第二次是B獲取A的公鑰,即使都被敵方截獲,也沒有危險性,因為只有A的私鑰才能對訊息進行簽名,即使知道了訊息內容,也無法偽造帶簽名的回覆給B,防止了訊息內容的篡改。

  但是,綜合兩個場景你會發現,第一個場景雖然被截獲的訊息沒有洩露,但是可以利用截獲的公鑰,將假指令進行加密,然後傳遞給A。第二個場景雖然截獲的訊息不能被篡改,但是訊息的內容可以利用公鑰驗籤來獲得,並不能防止洩露。所以在實際應用中,要根據情況使用,也可以同時使用加密和簽名,比如A和B都有一套自己的公鑰和私鑰,當A要給B傳送訊息時,先用B的公鑰對訊息加密,再對加密的訊息使用A的私鑰加簽名,達到既不洩露也不被篡改,更能保證訊息的安全性。

  總結:公鑰加密、私鑰解密、私鑰簽名、公鑰驗籤。

以上內容引用來自博文:https://www.cnblogs.com/pcheng/p/9629621.html

三、RSA加密實踐

我們弄明白了加解密原理,再來實踐,就不會覺得那麼生疏了。我之前也是對其不理解,後來用自己的產品實踐了一波,也虛心向開發請教,終究是成功了。

Jmeter提供了JSR223PreProcessor前置處理器,該工具融合了Java8Nashorn指令碼引擎,可以執行js指令碼以便對指令碼進行前置處理。

我們先來新增前置處理器JSR223PreProcessor,在http請求中新增,如下圖所示:

新增好後,對該元件進行配置,language選擇為javascript即可,如下所示:

接下來就是編寫程式碼了,JSR223PreProcessor前置處理器,支援java語言。這其中,需要引入一個js檔案,該js檔案就是前端引用進行加密的公共程式碼,可以直接與前端溝通,讓其分享一份即可,jmeter實現加密程式碼參考如下:

var navigator = this;
var window = this;
load("jsencrypt.min.js");
log.info("jsencrypt.min.js載入成功");
function RSA(){
 var encrypt = new JSEncrypt();
 encrypt.setPublicKey("");            //公鑰
 var rsaPassWord = encrypt.encrypt(""); //加密內容
 return rsaPassWord;
 }

var data = RSA();
log.info(data);
//data = data.replace(/\+/g,"%2B"); 
//data = data.replace(/\//g,"%2F");
vars.put("rsa_password",data);

在登入介面中引用加密後的密碼變數,如下所示:

來執行一下指令碼,檢視結果,首先來確認加密後的密碼是否成功獲取,如下所示:

檢視密碼加密成功與否,也可以檢視日誌,如下所示:

到此,RSA加密登入,就實現了,是不是很簡單。

四、問題總結

博文中描寫結果是很簡單,但實際實踐過程,還是爬了一些坑的。

①javax.script.ScriptException: TypeError: Cannot load script from jsencrypt.min.js in <eval> at line number 1

解決辦法:更換jmeter版本3.0即可

②javax.script.ScriptException: ReferenceError: "navigator" is not defined in jsencrypt.min.js at line number 1033

解決辦法:提示js檔案中的navigator、window未定義(與瀏覽器有關的物件)。在網上搜索js加密方式,看了些別人對RSA加密程式碼實現的解析和說明,發現JSEncrypt是前端使用的實現RSA加密的庫,navigator、window報錯的問題,只需要在js檔案頭定義如下兩行程式碼,即可解決此問題。

var navigator = this; 
var window = this;

③js檔案存放位置

由於js檔案放置的位置不準確,導致被迷糊了很久,後面才發現,在使用JSR223 PreProcessor前置處理器操作時,需要將jsencrypt.min.js放到C盤使用者路徑下,這裡需要特別注意。

 

本文僅代表作者觀點,系作者@溫一壺清酒發表。
歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
文章出處:http://www.cnblogs.com/hong-fithing/