Skip to content

Commit c7dcdfe

Browse files
committed
新增文档
1 parent a191f49 commit c7dcdfe

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

进阶/asymmetric-enc-dec.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
## 前言
2+
3+
刚回答了SegmentFault上一个兄弟提的问题[《非对称解密出错》](https://segmentfault.com/q/1010000013016668/a-1020000013017090 "《非对称解密出错》")。这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下。
4+
5+
非对称加密的理论知识,可以参考笔者前面的文章[《NODEJS进阶:CRYPTO模块之理论篇》](https://www.chyingp.com/nodejs%E8%BF%9B%E9%98%B6%EF%BC%9Acrypto%E6%A8%A1%E5%9D%97%E4%B9%8B%E7%90%86%E8%AE%BA%E7%AF%87/ "《NODEJS进阶:CRYPTO模块之理论篇》")
6+
7+
完整的代码可以在 [《Nodejs学习笔记》](https://github.com/chyingp/nodejs-learning-guide "这里") 找到,也欢迎大家关注 [程序猿小卡的GitHub](https://github.com/chyingp "gayhub")
8+
9+
## 加密、解密方法
10+
11+
在Node.js中,负责安全的模块是`crypto`。非对称加密中,公钥加密,私钥解密,加解密对应的API分别如下。
12+
13+
加密函数:
14+
15+
```javascript
16+
crypto.publicEncrypt(key, buffer)
17+
```
18+
19+
解密函数:
20+
21+
```javascript
22+
crypto.privateDecrypt(privateKey, buffer)
23+
```
24+
25+
## 入门例子
26+
27+
假设有如下`utils.js`
28+
29+
```javascript
30+
// utils.js
31+
const crypto = require('crypto');
32+
33+
// 加密方法
34+
exports.encrypt = (data, key) => {
35+
// 注意,第二个参数是Buffer类型
36+
return crypto.publicEncrypt(key, Buffer.from(data));
37+
};
38+
39+
// 解密方法
40+
exports.decrypt = (encrypted, key) => {
41+
// 注意,encrypted是Buffer类型
42+
return crypto.privateDecrypt(key, encrypted);
43+
};
44+
```
45+
46+
测试代码`app.js`
47+
48+
```javascript
49+
const utils = require('./utils');
50+
const keys = require('./keys');
51+
52+
const plainText = '你好,我是程序猿小卡';
53+
const crypted = utils.encrypt(plainText, keys.pubKey); // 加密
54+
const decrypted = utils.decrypt(crypted, keys.privKey); // 解密
55+
56+
console.log(decrypted.toString()); // 你好,我是程序猿小卡
57+
```
58+
59+
附上公钥、私钥 `keys.js`
60+
61+
```javascript
62+
exports.privKey = `-----BEGIN RSA PRIVATE KEY-----
63+
MIICXQIBAAKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8ZECKnnO8XRDwttBbf5EmG0qV
64+
8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kAZ6CZZo1vYgtzhlFnxd4V7Ra+
65+
aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEjeogAOgXACaIqiFyrk3wIDAQAB
66+
AoGBAKdrunYlqfY2fNUVAqAAdnvaVOxqa+psw4g/d3iNzjJhBRTLwDl2TZUXImEZ
67+
QeEFueqVhoROTa/xVg/r3tshiD/QC71EfmPVBjBQJJIvJUbjtZJ/O+L2WxqzSvqe
68+
wzYaTm6Te3kZeG/cULNMIL+xU7XsUmslbGPAurYmHA1jNKFpAkEA48aUogSv8VFn
69+
R2QuYmilz20LkCzffK2aq2+9iSz1ZjCvo+iuFt71Y3+etWomzcZCuJ5sn0w7lcSx
70+
nqyzCFDspQJBAN3O2VdQF3gua0Q5VHmK9AvsoXLmCfRa1RiKuFOtrtC609RfX4DC
71+
FxDxH09UVu/8Hmdau8t6OFExcBriIYJQwDMCQQCZLjFDDHfuiFo2js8K62mnJ6SB
72+
H0xlIrND2+/RUuTuBov4ZUC+rM7GTUtEodDazhyM4C4Yq0HfJNp25Zm5XALpAkBG
73+
atLpO04YI3R+dkzxQUH1PyyKU6m5X9TjM7cNKcikD4wMkjK5p+S2xjYQc1AeZEYq
74+
vc187dJPRIi4oC3PN1+tAkBuW51/5vBj+zmd73mVcTt28OmSKOX6kU29F0lvEh8I
75+
oHiLOo285vG5ZtmXiY58tAiPVQXa7eU8hPQHTHWa9qp6
76+
-----END RSA PRIVATE KEY-----
77+
`;
78+
79+
exports.pubKey = `-----BEGIN PUBLIC KEY-----
80+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFWnl8fChyKI/Tgo1ILB+IlGr8
81+
ZECKnnO8XRDwttBbf5EmG0qV8gs0aGkh649rb75I+tMu2JSNuVj61CncL/7Ct2kA
82+
Z6CZZo1vYgtzhlFnxd4V7Ra+aIwLZaXT/h3eE+/cFsL4VAJI5wXh4Mq4Vtu7uEje
83+
ogAOgXACaIqiFyrk3wIDAQAB
84+
-----END PUBLIC KEY-----
85+
`;
86+
```
87+
88+
## 小结
89+
90+
可以看到,通过Node.js进行非对称加密、解密还是挺方便的。更多用法,可以参考官方文档。
91+
92+
## 相关链接
93+
94+
[程序猿小卡的GitHub](https://github.com/chyingp "程序猿小卡的GitHub")
95+
96+
[Nodejs学习笔记](https://github.com/chyingp/nodejs-learning-guide "Nodejs学习笔记")
97+
98+
[非对称解密出错](https://segmentfault.com/q/1010000013016668/a-1020000013017090 "非对称解密出错")
99+
100+
[https://nodejs.org/api/crypto.html](https://nodejs.org/api/crypto.html)

0 commit comments

Comments
 (0)