Идея использования jsencrypt для реализации асимметричного шифрования:
1. Сгенерируйте открытый ключ и закрытый ключ: внешний интерфейс генерирует зашифрованный пароль с использованием открытого ключа, а для внутренней расшифровки требуется закрытый ключ;
Создайте открытый и закрытый ключ в узле
const NodeRSA = require("node-rsa");
const fs = require("fs")
//生成公钥
function generator() {
var key = new NodeRSA({ b: 512 })
key.setOptions({ encryptionScheme: 'pkcs1' })
var privatePem = key.exportKey('pkcs1-private-pem')
var publicPem = key.exportKey('pkcs8-public-pem')
fs.writeFile('./pem/public.pem', publicPem, (err) => {
if (err) throw err
console.log('公钥已保存!')
})
fs.writeFile('./pem/private.pem', privatePem, (err) => {
if (err) throw err
console.log('私钥已保存!')
})
}
generator();
2. Серверной части необходимо настроить интерфейс, предоставляющий открытый ключ для использования внешней частью:
const fs = require("fs")
app.get("/getPublicKey",(req,res)=>{
let publicKey = fs.readFileSync('./pem/public.pem', 'utf-8');
res.send({ 'status': 0, 'msg': '公钥获取成功', 'resultmap': publicKey });
})
3. Внешний интерфейс получает шифрование с открытым ключом и передает его серверной части:
<body>
<input type="text" name="pwd">
<button>提交</button>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
//在node包中下载jsencrypt,之后引入即可
<script src="./js/jsencrypt.js"></script>
<script>
let str = ""
$.ajax({
type: "get",
url: "http://localhost:3030/getPublicKey",
success: function (response) {
str = response.resultmap
}
});
//使用公钥加密
function _getPublicKey(password) {
let encryptor = new JSEncrypt();
encryptor.setPublicKey(str)
return encryptor.encrypt(password)
}
$("button").on("click",function(){
let pwd = $("[name=pwd]").val();
//加密后的密码
let deCode = _getPublicKey(pwd);
$.ajax({
type: "post",
url: "http://localhost:3030/login",
data: {
pwd:deCode
},
success: function (response) {
console.log(response)
}
});
})
</script>
</body>
4. Фон получает зашифрованный пароль из базы данных для расшифровки:
//后台利用的是私钥解密,这个是后台解密的方法
let deCode = (password) => {
const _priKey = fs.readFileSync(path.resolve(__dirname, './pem/private.pem'));
let jsencrypt = new JSEncrypt()
jsencrypt.setPrivateKey(_priKey.toString())
return jsencrypt.decrypt(password)
}
Примечания: это всего лишь краткий обзор использования; внешний интерфейс использует jQuery для тестирования, и его также можно использовать в vue.