基於RSA的WEB前端密碼加密方案

2022-02-23 16:05:49 字數 1535 閱讀 4018

受制於web頁面原始碼的暴露,因此傳統的對稱加密方案以及加密金鑰都將暴露在js檔案中,同樣可以被解密。

目前比較好的解決方案是web頁面全程或使用者登入等關鍵環節使用https進行傳輸。

另外一種解決方案就是通過rsa進行加密。

也就是說公鑰並不能進行解密,因此進行明文傳輸也是安全的。

1、加密流程

服務端生成一組公鑰與私鑰,將公鑰傳送給客戶端進行密碼加密,在使用金鑰進行解密。

2、金鑰生成(nodejs)

主要使用  node-rsa 來生成rsa公鑰、私鑰:

1 import nodersa from 'node-rsa';

2 3 let key=new nodersa();

4 let publicder=key.exportkey('pkcs8-public');

5 let privateder=key.exportkey('pkcs8-private');

一般在伺服器啟動的時候可以生成一組金鑰,並快取起來,方便後續解密使用!

3、密碼加密(瀏覽器端)

客戶端接收到公鑰以後,再提交表單之前對密碼進行加密傳輸:

1 import nodersa from 'node-rsa';

2 3

4 var encryptstr=function(password) );

6 var publickey=localstorage.publickey; //從服務端接收到的公鑰,快取到本地

7 clientkey.importkey(publickey);

8 let encrypted = clientkey.encrypt(password, 'base64');

9 return encrypted;

10 }

需要注意的問題是:

客戶端引入node-rsa庫會相對增加js檔案體積,請注意上線之前對**進行壓縮或者更換其他體積較小的rsa類庫。

4、密碼解密(nodejs)

服務端收到客戶端請求後,通過生成的私鑰對加密後的密碼進行解密:

1 import nodersa from 'node-rsa';

2 3

4 5 let decryptstr=function());

7 let privateder=await util.getcache("rsa.privatecache"); //從快取讀取私鑰

8 if(util.isempty(privateder))

12 key.importkey(privateder);

13 if(!key.isprivate())

17 return key.decrypt(pwd, 'utf8'); //解密

18 }

19

**:

前端實現rsa加密

rsa加密演算法是一種非對稱加密演算法。對極大整數做因數分解的難度決定了rsa演算法的可靠性。換言之,對一極大整數做因數分解愈困難,rsa演算法愈可靠。假如有人找到一種快速因數分解的演算法的話,那麼用rsa加密的資訊的可靠性就肯定會極度下降。但找到這樣的演算法的可能性是非常小的。今天只有短的rsa鑰...

RSA流密碼互補加密

rsa加密具有非對稱性可以完成諸如數字簽名及驗籤之類的事情,這是對稱密碼所不能完成的,但是能加密的內容很少速度較慢,且金鑰冗長不便於使用。而流密碼加密是一種對稱加密簡單並且安全性很高,且速度很快能加密的資訊量很大。如果將兩者結合起來就能做出一種能完成數字認證又能快速加密大量資訊的軟體。實際上只要簡單...

基於Python的RSA加密實現

rsa演算法的具體描述如下 5 1 任意選取兩個不同的大素數p和q計算乘積 5 2 任意選取乙個大整數e,滿足 整數e用做加金鑰 注意 e的選取是很容易的,例如,所有大於p和q的素數都可用 5 3 確定的解金鑰d,滿足 即 是乙個任意的整數 所以,若知道e和,則很容易計算出d 5 4 公開整數n和e...