欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析Node.js非对称加密方法

程序员文章站 2023-02-02 19:54:36
前言 刚回答了segmentfault上一个兄弟提的问题《非对称解密出错》。这个属于node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总...

前言

刚回答了segmentfault上一个兄弟提的问题《非对称解密出错》。这个属于node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下。

非对称加密的理论知识,可以参考笔者前面的文章《nodejs进阶:crypto模块之理论篇》。

完整的代码可以在 《nodejs学习笔记》 找到,也欢迎大家关注 程序猿小卡的github。

加密、解密方法

在node.js中,负责安全的模块是crypto。非对称加密中,公钥加密,私钥解密,加解密对应的api分别如下。

加密函数:

crypto.publicencrypt(key, buffer)

解密函数:

crypto.privatedecrypt(privatekey, buffer)

入门例子

假设有如下utils.js

// utils.js
const crypto = require('crypto');
// 加密方法
exports.encrypt = (data, key) => {
 // 注意,第二个参数是buffer类型
 return crypto.publicencrypt(key, buffer.from(data));
};
// 解密方法
exports.decrypt = (encrypted, key) => {
 // 注意,encrypted是buffer类型
 return crypto.privatedecrypt(key, encrypted);
};

测试代码app.js:

const utils = require('./utils');
const keys = require('./keys');
const plaintext = '你好,我是程序猿小卡';
const crypted = utils.encrypt(plaintext, keys.pubkey); // 加密
const decrypted = utils.decrypt(crypted, keys.privkey); // 解密
console.log(decrypted.tostring()); // 你好,我是程序猿小卡

附上公钥、私钥 keys.js:

exports.privkey = `-----begin rsa private key-----
miicxqibaakbgqdfwnl8fchyki/tgo1ilb+ilgr8zecknno8xrdwttbbf5emg0qv
8gs0agkh649rb75i+tmu2jsnuvj61cncl/7ct2kaz6czzo1vygtzhlfnxd4v7ra+
aiwlzaxt/h3ee+/cfsl4vaji5wxh4mq4vtu7uejeogaogxacaiqifyrk3widaqab
aogbakdrunylqfy2fnuvaqaadnvavoxqa+psw4g/d3inzjjhbrtlwdl2tzuximez
qeefueqvhorota/xvg/r3tshid/qc71efmpvbjbqjjivjubjtzj/o+l2wxqzsvqe
wzyatm6te3kzeg/culnmil+xu7xsumslbgpaurymha1jnkfpakea48auogsv8vfn
r2quymilz20lkczffk2aq2+9isz1zjcvo+iuft71y3+etwomzczcuj5sn0w7lcsx
nqyzcfdspqjban3o2vdqf3gua0q5vhmk9avsoxlmcfra1rikufotrtc609rfx4dc
fxdxh09uvu/8hmdau8t6ofexcbriiyjqwdmcqqczljfddhfuifo2js8k62mnj6sb
h0xlirnd2+/ruutubov4zuc+rm7gtuteoddazhym4c4yq0hfjnp25zm5xalpakbg
atlpo04yi3r+dkzxquh1pyyku6m5x9tjm7cnkcikd4wmkjk5p+s2xjyqc1aezeyq
vc187djprii4oc3pn1+takbuw51/5vbj+zmd73mvctt28omskox6ku29f0lveh8i
ohiloo285vg5ztmxiy58taipvqxa7eu8hpqhthwa9qp6
-----end rsa private key-----
`;
exports.pubkey = `-----begin public key-----
migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdfwnl8fchyki/tgo1ilb+ilgr8
zecknno8xrdwttbbf5emg0qv8gs0agkh649rb75i+tmu2jsnuvj61cncl/7ct2ka
z6czzo1vygtzhlfnxd4v7ra+aiwlzaxt/h3ee+/cfsl4vaji5wxh4mq4vtu7ueje
ogaogxacaiqifyrk3widaqab
-----end public key-----
`;