Web前端實踐:Node-RSA 與 JSEncrypt進行前后端傳輸加密,sha512密碼密文存儲


1 Node-RSA 與 JSEncrypt 實現前端加密后端解密功能

cnpm install jsencrypt -S

cnpm install node-rsa -S

1.1 生成私鑰、公鑰對

var  NodeRSA  = require('node-rsa')
 //1.創建RSA對象,並指定 秘鑰長度
var key = new NodeRSA({ b: 512 });
key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式

 //2.生成 公鑰私鑰,使用 pkcs8標准,pem格式
var publicPem = key.exportKey('pkcs8-public-pem');//制定輸出格式
var privatePem = key.exportKey('pkcs8-private-pem');

console.log('公鑰:\n',publicPem);
console.log('私鑰:\n', privatePem);

image-20201227204353247

node-rsa中有對公鑰私鑰的規定

image-20201227204959767

可以看出,我們生成的屬於pkcs8,而且導出的方法是pkcs8-private-pem,這個在后面后端解密的時候需要再次用到

1.2 前端加密

前端在/js文件夾中准備好了JSEncrypt的代碼

<script src="../js/jsencrypt.min.js"></script>

在頁面js中

var encryptor = new JSEncrypt();
var pubKey =  `-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI4Sd1JVtIIrHDoMcknO6iva2+iAMPFo
Jx+dGrjlgvcYdyePwPJft1ZB4WkZb/vRHN8UKn123CV5B2XolmqrDv0CAwEAAQ==
-----END PUBLIC KEY-----`
encryptor.setPublicKey(pubKey)

在ajax請求時對數據進行加密

data: {
	username:encryptor.encrypt(document.getElementById("username").value) ,
	password:encryptor.encrypt(document.getElementById("password").value)
}

1.3 后端解密

后端使用node-rsa進行解密,需要注意的是,因為jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。

var  NodeRSA  = require('node-rsa')
const priKey ='-----BEGIN PRIVATE KEY-----\n'+
'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAjhJ3UlW0giscOgxy\n'+
'Sc7qK9rb6IAw8WgnH50auOWC9xh3J4/A8l+3VkHhaRlv+9Ec3xQqfXbcJXkHZeiW\n'+
'aqsO/QIDAQABAkBwCF/PrYYKn7RCkk4Npf1DV/LSBUSTGW7An0LTSylbb+HKp73X\n'+
'QUeALkJ3ranLe3UBiAGXZq4IywuDVSu9I4yBAiEAzoY9O1TRcQt8QdG6wNjB5VQM\n'+
'zmkTtMzicBEu2JtCu7cCIQCwG31HUw7+emB6eDiiLDor/IoeQxujEZu4tMgXcDky\n'+
'6wIhAMuT8+P6dgJzCedvsCHNCUTgF0eYuL4ugL9rkLwgQCX9AiAwLYULYyyh78a/\n'+
'Gm6b5y+O4wrCFqfT57hLQqHOz7PGOwIgPN0W26+BrhXIaazkCEf0/qz95cwHEdgl\n'+
'Sc6Jev4DrBw=\n'+
'-----END PRIVATE KEY-----'
var decrypt = new NodeRSA(priKey,'pkcs8-private-pem')
decrypt.setOptions({ encryptionScheme: 'pkcs1' }) 

在接受請求時,對數據進行解密,並嘗試進行解密

app.post("/register",function(req,res){
	 var name = decrypt.decrypt(req.body.username,'utf-8');
    var psw = decrypt.decrypt(req.body.password,'utf-8');
    console.log("name "+name+' psw '+psw);
    ...
 }

1.4 效果

可以看到,前端發出的請求被加密

image-20201227205615628

而后端經過解密后,得到了正確的數據

image-20201227205642565

參考鏈接:

前端利用jsencrypt.js進行RSA加密https://www.jianshu.com/p/5008a407b558

nodejs RSA 與 jsencrypt實現前端加密后端解密功能https://blog.csdn.net/weixin_34037515/article/details/92411973

前端加解密方案探討https://www.cnblogs.com/wonyun/p/10164364.html

2 sha512數據存儲加密

在存儲到數據庫的時候,也需要進行加密,而不應該明文存儲,這里選擇了使用sha512進行加密

cnpm install js-sha512 --save

這里使用了用戶名作為加鹽值

var sha512 = require('js-sha512');
var sha = sha512(name+psw);
var myobj = { 'name': name, 'password': sha };
...
userdb.insertOne(myobj);

可以看到,經過處理后的數據庫密碼使用了密文存儲

image-20201227210041472


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM