一、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盤用戶路徑下,這里需要特別注意。