Skip to content

Commit 5d5df9b

Browse files
tls/ssl
1 parent 396c85d commit 5d5df9b

File tree

15 files changed

+435
-0
lines changed

15 files changed

+435
-0
lines changed

Security/crypto.md

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## 加密
2+
3+
4+
### 加密算法分类
5+
* 对称加密
6+
* 加密解密使用同样的秘钥
7+
* 非对称加密(公开密钥加密)
8+
* 公钥加密的数据只能用私钥解密
9+
* 私钥加密的数据只能用公钥解密
10+
11+
### HTTPS、TLS、SSL
12+
HTTPS 也称作 HTTP over SSL,相当于 HTTP + SSL/TLS。
13+
TLS 的前身是 SSL,TLS 1.0 常被标识为 SSL 3.1, TLS1.1 为 SSL 3.2,TLS 1.2为SSL 3.3
14+
15+
#### SSL/TLS 的运行过程
16+
其基本思路是采用公钥加密算法,客户端向服务器所有公钥,使用公钥加密后传输信息,服务器使用私钥解密。
17+
为了防止公钥被篡改,采用数字证书(包含公钥等信息,客户端通过数字签名进行验证),只要证书是可信的,公钥就是可信的,浏览器内置CA根证书。
18+
非对称加密计算量较大,所以在每一次会话时客户端和服务器均生成一个 会话秘钥 ,使用会话秘钥进行对称加密,对会话秘钥进行非对称加密,以减少加密所消耗的时间。
19+
20+
主要流程分四个步骤,这四个步骤通信都是明文的
21+
22+
* 客户端先向服务器发起请求,并提供信息
23+
* 支持的协议版本,如:TLS 1.2
24+
* 客户端随机数,用于生成会话秘钥
25+
* 支持的加密算法
26+
* 支持的压缩算法
27+
* 服务器回应请求,并返回以下内容
28+
* 确认使用的协议,若无法与浏览器所支持的达成一致则关闭加密通信
29+
* 服务器随机数,用于生产会话秘钥
30+
* 确认加密使用算法
31+
* 服务器的数字证书
32+
* 客户端收到回应,验证证书(证书机构,域名,时效等), 通过后再向服务器发送以下信息
33+
* 一个随机数,使用服务器公钥加密
34+
* 编码改变通知,标记随后信息均使用加密方法和秘钥传送
35+
* 客户端握手结束通知,同时也是前面发送内容的 hash 值,用来供服务器校验
36+
37+
* 服务器最后回应
38+
* 编码改变通知,标记随后使用约定的加密方法和秘钥发送
39+
* 服务器握手结束通知,同时也是前面发送内容的 hash 值,供客户端校验
40+
41+
上述过程出现了三个随机数,前两个明文发送,第三个则通过公钥加密发送,此时客户端和服务端均知道这三个随机数,两端分别使用事先约定的加密算法生成同一把 会话秘钥,之后的传输,使用这个会话秘钥进行对称加密。
42+
43+
#### 数字证书如何确保不被篡改
44+
* 客户端不可能内置所有公钥,但可内置 CA 公钥证书(数量不多)
45+
* 若服务端给客户端仅传递公钥,中途可能被中间人替换公钥,无法确保信息不泄露
46+
* 服务端可以通过 CA 认证拿到 数字证书(包含公钥和数字签名等),传递给客户端(传输过程也可能被替换,但浏览器无法解密,除非客户端信任被替换的证书)
47+
* 客户端接收到服务器的数字证书后,通过 CA 解密拿到公钥和数字签名,同时客户端通过相同算法(域名,证书,等信息)自己生成数字签名,与数字证书内的签名进行对比。
48+
49+
50+
### https通信如何劫持?
51+
* 客户端信任中间人证书
52+
* 中间人自己签发数字证书,由于客户端已信任中间人证书,则与中间人建立 https 连接,
53+
* 中间人与真实服务器链接,并转发响应信息给客户端
54+
* 重要的是,不要轻易信任证书
55+
56+
57+
58+
59+
60+
61+

Security/crypto/assets/private.pem

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: AES-256-CBC,A1ACC788CA8C691CD02A9B83745082D1
4+
5+
KyAphDlWN0AK59zdkH5Z4oQsnpmbmZwZ1iPAoEsBE0dyc65+lLYdbik7KpQqiGCx
6+
9pVjRgoTPhlPVptJmNOxMMdVXREeIUZ62lR/RsMjlTOYewKGpRPOkGFbKMceEai5
7+
ZVOScGh8156Tg8QW0kJHD4yfECCjJ1rhbpqEq+HEG2kwQAF3b6p6QX+ZDOk7aw1B
8+
ss/sE16k/8CYxrvhE9S+2GP6N9oFj17LFkVYg5x8tPf+iZ5jgObnaR+gvbEiTj2f
9+
Or2GF8PRm6fYmueDS2EporZp+JauiBxSOLny4i9skXCXTzsuMUkPrG3YoCwW8xZv
10+
sBbexoqoYZtifN54Xd8AlBfzkwsjHNoHd2Wp/5C4LojuNRWRThH2UcIPAXS5mkul
11+
e8X6llB/0YY+sfESN01VYXBlkenwWjUA8HP3Cy46V/Ah58K5cmyEj+E7Ryk1UvJO
12+
nulUhBV0JbbPEQBmbHoq+D39RqtNWx8crH+xCFUllNfq2EdPftSmZTmCOCCJzwzs
13+
5b8NTiyBI99T6WMTBiJUB8y/AmCwzO+YBTooYoJmdQg2Gv+4jWoLi5xKGWva9+SM
14+
k44mS1Ew84vYYlMB7lpa3VSEwKvo6yOhvV3fwpwPC3qxF2bsCalY4HC3Yh6ArC9O
15+
RTJU42UdFoKscpJN2Djujl3Fm6SIzfoLdaY5ifguT9a3Kv7md/blJqVKRhmWFiJj
16+
kaOT2LPcqUw8c2URC8srE4Ba/U0J0FY64eIfXbJM/MKW9YFQOl/8qYNBlaa81E9r
17+
TYvmyZhFH6oksr4bEnq9NJHtkk2E9/pMCTMBej7Kb24m9GL8v4kr52Dow8H4vQQ8
18+
H3lMXj/Te+qU0m+CTXVKcDyAJ+KvwGCOOp588XVkff3bO6rXHeWux0fv3MWfIpRx
19+
78TeEyy3ZnUOCfUeXNEXC7uZcoXXAT+6q56Kr5o2NFccnaKKwKU4wvYgvMcIKncj
20+
k4rX7YYAqsjLixEy9p1p04zNNRwXcFq13ZFXWEP2ZDvv0S33XJEDAmIPgLwMSRB5
21+
lh/tE0RThbEy0YXoeDFSFf9qBcRqgHa8LMEnahzqmfT9iE5jdsCYQaNEODMcbi9K
22+
jy2DtgJx28Zqi+KqBGGy6JgUA8lH7lJIDas8IvQjVUjODv6V7hm+Ipw7N1zkFXFN
23+
hJ4CIOiRwsIeKnYmJ4AOOBl059vWn09OvZ1h+t+srHVvRzPjy0eidIczC6iljrwv
24+
69pFrwJtscYl9NuMiZhMrzl5ahEfujQwgk5/+CEusif5uHyyz/epQhZwkkAf2FWe
25+
eoZWicxfOtSF2dkr+mwlPDJhaZMSFU+YSgtvdFsNIOFf5PhIPQ7B4DhJGvD8Z2bl
26+
le8x0T38xhUZQ1bt/lHaprLkfUPuOE84pgrWvEVRgaRawetK40XXoHPljGaIyGX6
27+
9HouRpnLDzUTVY3jXiZTdcv8PyZhXTezi65Oola0lTpDB8XwZSBw300jJDNtFz7i
28+
CEWgPo6jNpEzI6EAOJmpMT23HG0kB4AQ0vF3jslzP/nuK4/IZ3nE/PaL3Vm6not3
29+
84tgLWfAWQ60hbWGFlE/LxSBBl9EzunGl8ITWH4I3OFVMNDE4e7FKXVRmtH1wHz3
30+
yo8CC4tD4hMXzYL1j5RUZ7YyqaaKEx0SHffJ+fB9DyI9HuhYasPzHvbKCs0Ef0H8
31+
sp6wJBVftVxlDxkHJZfBuQGs9B3MztOb3jVz0NT7q0wfY7b8O1of68idrLhduHs3
32+
4ZOLiZygCNopk78J31zXjCQXrTe9utUKRvMqDNmR1oWq0JQWf0ThFjXsuPVOkxfq
33+
fTRFRwtsrqb44rXD0rQdr6WJPlatPm/hlOGWU9TB6+zpFGGpjy0vMcC5Ebv2PH41
34+
nNkkfbv+PsxrcZOXWxMdZLmNlQ5k+rKTn1A9tEy9I3RVzmtx8/1RYBWu+yWeMdYB
35+
TtcFs6kLIJIpRuPCTbOtj8gWCtNhEnGHViYAtp0uL5KndvyMPzBFu1yPYxK8+YKr
36+
agdApqc9MmFcq0z4LgXPOhNU+VRaxqVB/yEgcvXZ5JwYvnGCDDyk7M0TFsy/kEaA
37+
KyK8dJt9hT8TBFfaNVxWzNWQgIg65kTwIVWUewh7Ao6NTEglzoXxSvUExGC3i4DC
38+
RoaEHj8+db/mQmG/DJK1+zYB1sZz8Zfqr+7hPhJVGlfWTZxa8eev7Mop5TsUIXRC
39+
lIxTx29QlQ7ZUY7MCg1/lQDtesz+fh8i/a4E9/Sm7APkQsRymgSUEUasiAvkwhmH
40+
GU8DrGUZW/7ucSZL8kv9XjaUuVzxZqmPY0EovR6hEvyUdRRvrPO/27tZufdZZXJe
41+
/35fsB6muEjhFwPCjfYdbAOBQKUy+RYZV7QfcjmpZHrba9cUYuErbiiJCNcWHZH2
42+
JJtjZ8EDNLX7tPSwWFe+DcfGV5c18nVyX2WSWlOFIGOmB5k3kLeTVfhB9PFPdtKP
43+
29m5vc7zGMHUC4VohYRblIIJVv6EUankKspp9Yu6UB+kWPo9GK/cpEUQuYWKPgNo
44+
fmmO2g81Dwrt9yTHoe+DcQhzAOVWKBt4m8plxu968IZxu4mqPNNxRpJW0QapihoP
45+
qKy9fzNXlBNjgYf16TAm8OLbAKuklhCJqwIg6A2KgQK+n6c4QRw9g5QnTbLjw+5A
46+
v7xUm5wkzQKd27kit4GWkyPrA6a4JO98ErjaSWyqMm3MS2tOpg30duozKby9FBRW
47+
debKcDIwetEbeXxRg0mbPryT3DpZxtqAszw9+awIYF1dNfkzt2VZhFacwYNyXJ40
48+
gv+k54pfP2CBqANKSJeyH3JAWZ8KTCB9wqVyqBbsk9cE5S3tjiSE5VSTn65V9WuR
49+
b7hz4eA1ktOmkJUlNWkjCGqRa3zxUZ0VsIxs3hr1J1NOH/NNUY+HZsacgL9qIe0z
50+
gpm6FH9f3Chdly0zeTP8D4ao566ZkgSstIdm5TGjEwKftiJTXxEakeLlc6SfchBX
51+
eZ4Y3AbPiSnKYApBfkTTJk5PzkmrcN3wg9HqbzKA6BkSo87PrsX7XbFP/aDEc1Rf
52+
NcUUmvPMhF/UJyXr1Ty6fTVwhsMHtPSIfo5I2V5dLezy11rb0P8wCb0IgtktahjA
53+
AoDdzXtjszb6wFYSeGk5yzplCwlNlJ3jnk/iYU/cZd114fDQ53dOFynY0HiXcUSw
54+
-----END RSA PRIVATE KEY-----

Security/crypto/assets/public.pem

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN RSA PUBLIC KEY-----
2+
MIICCgKCAgEA2Vi3YzQWrBCLQkaJJehwDBnJQXkhwL6sGZhOZw5PSFPWQH/wHtok
3+
lb83GSrf8N4nv5jTmqE988V7xosFEaMKutmoC72u5mSwNibVQ6uneMU/TO/PJjmb
4+
pu1agrCFkYyHYCiAS4BZL5xVOSc+1dwUcdFG5fptwMealX1CRGsE1kHY2bu3tT22
5+
MVLkTnT7ARK+ofjJfASFlEozVfH/Zyl5ml2CdvIu+H91iuARV8z8BD2Lmt6fHLx9
6+
AAIYZzne5kvXKKBW1sK1VBFC22982Az1XNYf1wM2RlUoejlt/86xx2SOqwKRrUmV
7+
C7qRDATKUS9SJDv5wlXvQXRGtZjYHM7X6sq13ubsP/fUB5WXbhcEVnIgEb4tlko+
8+
SU34SGHg50h0OQkNghaD747v7c1VRP61+NFuHyMH61MMY6c83b7lwbZ/prhDwDLZ
9+
Scx6Eu6QrUHZNDxnv+fEv9WA1QEOGJjPMmRpOhsj6snTQR2aDhQyKNQNBSW4jW7A
10+
O4onvSaddzFHX1U0tQuv0MLiR8ZyGVuOJJv7Fpl5tbUrTIOBkwCB0473/4P0hOH4
11+
ylCBqTrjPDwFIZ7jqZVM6T9EcXg6e5/bE0FJJKest4i+twC3z9Smn9tsXzHA4ap0
12+
LNR6rWYRuBA5dtCxb7orcRcK70Wrwj+nmUgsUp7FYXzwxw9aClptb+cCAwEAAQ==
13+
-----END RSA PUBLIC KEY-----

Security/crypto/create-secret.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const crypto = require('crypto');
2+
const fs = require('fs');
3+
4+
// nodejs v10.12.0 +
5+
const {publicKey, privateKey} = crypto.generateKeyPairSync('rsa', {
6+
modulusLength: 4096,
7+
namedCurve: 'namedCurve',
8+
publicKeyEncoding: {
9+
type: 'pkcs1',
10+
format: 'pem'
11+
},
12+
privateKeyEncoding: {
13+
type: 'pkcs1',
14+
format: 'pem',
15+
cipher: 'aes-256-cbc',
16+
passphrase: 'private-key-passphrase'
17+
}
18+
});
19+
20+
fs.writeFileSync('./assets/public.pem', publicKey);
21+
fs.writeFileSync('./assets/private.pem', privateKey);

Security/crypto/encrypt-decrypt.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const crypto = require('crypto');
2+
const fs = require('fs');
3+
const assert = require('assert');
4+
5+
// 可使用 node create-secret.js 生成公钥私钥
6+
const publicKey = fs.readFileSync('./assets/public.pem');
7+
const privateKey = fs.readFileSync('./assets/private.pem');
8+
// 要传输的信息
9+
const message = 'this is some message need be encrypt';
10+
11+
12+
// 私钥加密公钥解密
13+
const privateKeyEn = crypto.privateEncrypt({
14+
key: privateKey,
15+
passphrase: 'private-key-passphrase'
16+
}, Buffer.from(message));
17+
console.log(`私钥加密密文: ${privateKeyEn.toString('hex')}`);
18+
const publicKeyDe = crypto.publicDecrypt(publicKey, privateKeyEn);
19+
assert.deepStrictEqual(message, publicKeyDe.toString(), '公钥解密私钥加密的数据与原数据不一致');
20+
21+
22+
// 公钥加密, 私钥解密
23+
const publicKeyEn = crypto.publicEncrypt(publicKey, Buffer.from(message));
24+
const privateKeyDe = crypto.privateDecrypt({
25+
key: privateKey,
26+
passphrase:'private-key-passphrase'
27+
}, publicKeyEn);
28+
console.log(`公钥加密密文: ${privateKeyEn.toString('hex')}`);
29+
assert.deepStrictEqual(message, privateKeyDe.toString(), '私钥解密公钥加密的数据与原数据不一致');
30+
31+
32+
33+
// 对称加密
34+
const algorithm = 'aes-256-cbc';
35+
const key = '1234567890abcdef1234567890abcdef';
36+
const iv = '1234567890abcdef';
37+
38+
const enCipher = crypto.createCipheriv(algorithm, key, iv);
39+
let en = enCipher.update(message, 'utf8', 'hex');
40+
en += enCipher.final('hex');
41+
console.log(`对称加密密文: ${en}`);
42+
const deCipher = crypto.createDecipheriv(algorithm, key, iv);
43+
let de = deCipher.update(en, 'hex', 'utf8');
44+
de += deCipher.final('utf8');
45+
assert.deepStrictEqual(message, de, '解密对称加密数据与原数据不一致');
46+
47+
// // nodejs 支持的一些加密算法和 hash
48+
// console.log(crypto.getCiphers());
49+
// console.log(crypto.getCurves());
50+
// console.log(crypto.getHashes());

Security/demo/app.js

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const Koa = require('koa');
2+
const app = new Koa();
3+
const views = require('koa-views');
4+
const json = require('koa-json');
5+
const onerror = require('koa-onerror');
6+
const bodyparser = require('koa-bodyparser');
7+
const logger = require('koa-logger');
8+
9+
const index = require('./routes/index');
10+
const users = require('./routes/users');
11+
12+
// error handler
13+
onerror(app);
14+
15+
// middlewares
16+
app.use(bodyparser({
17+
enableTypes:['json', 'form', 'text']
18+
}));
19+
app.use(json());
20+
app.use(logger());
21+
app.use(require('koa-static')(__dirname + '/public'));
22+
23+
app.use(views(__dirname + '/views', {
24+
extension: 'pug'
25+
}));
26+
27+
// logger
28+
app.use(async (ctx, next) => {
29+
const start = new Date();
30+
await next();
31+
const ms = new Date() - start;
32+
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
33+
});
34+
35+
// routes
36+
app.use(index.routes(), index.allowedMethods());
37+
app.use(users.routes(), users.allowedMethods());
38+
39+
// error-handling
40+
app.on('error', (err, ctx) => {
41+
console.error('server error', err, ctx)
42+
});
43+
44+
module.exports = app;

Security/demo/bin/www

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/usr/bin/env node
2+
3+
/**
4+
* Module dependencies.
5+
*/
6+
7+
var app = require('../app');
8+
var debug = require('debug')('demo:server');
9+
var http = require('http');
10+
11+
/**
12+
* Get port from environment and store in Express.
13+
*/
14+
15+
var port = normalizePort(process.env.PORT || '3000');
16+
// app.set('port', port);
17+
18+
/**
19+
* Create HTTP server.
20+
*/
21+
22+
var server = http.createServer(app.callback());
23+
24+
/**
25+
* Listen on provided port, on all network interfaces.
26+
*/
27+
28+
server.listen(port);
29+
server.on('error', onError);
30+
server.on('listening', onListening);
31+
32+
/**
33+
* Normalize a port into a number, string, or false.
34+
*/
35+
36+
function normalizePort(val) {
37+
var port = parseInt(val, 10);
38+
39+
if (isNaN(port)) {
40+
// named pipe
41+
return val;
42+
}
43+
44+
if (port >= 0) {
45+
// port number
46+
return port;
47+
}
48+
49+
return false;
50+
}
51+
52+
/**
53+
* Event listener for HTTP server "error" event.
54+
*/
55+
56+
function onError(error) {
57+
if (error.syscall !== 'listen') {
58+
throw error;
59+
}
60+
61+
var bind = typeof port === 'string'
62+
? 'Pipe ' + port
63+
: 'Port ' + port;
64+
65+
// handle specific listen errors with friendly messages
66+
switch (error.code) {
67+
case 'EACCES':
68+
console.error(bind + ' requires elevated privileges');
69+
process.exit(1);
70+
break;
71+
case 'EADDRINUSE':
72+
console.error(bind + ' is already in use');
73+
process.exit(1);
74+
break;
75+
default:
76+
throw error;
77+
}
78+
}
79+
80+
/**
81+
* Event listener for HTTP server "listening" event.
82+
*/
83+
84+
function onListening() {
85+
var addr = server.address();
86+
var bind = typeof addr === 'string'
87+
? 'pipe ' + addr
88+
: 'port ' + addr.port;
89+
debug('Listening on ' + bind);
90+
}

Security/demo/package.json

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"name": "demo",
3+
"version": "0.1.0",
4+
"private": true,
5+
"scripts": {
6+
"start": "node bin/www",
7+
"dev": "./node_modules/.bin/nodemon bin/www",
8+
"prd": "pm2 start bin/www",
9+
"test": "echo \"Error: no test specified\" && exit 1"
10+
},
11+
"dependencies": {
12+
"debug": "^2.6.3",
13+
"koa": "^2.2.0",
14+
"koa-bodyparser": "^3.2.0",
15+
"koa-convert": "^1.2.0",
16+
"koa-json": "^2.0.2",
17+
"koa-logger": "^2.0.1",
18+
"koa-onerror": "^1.2.1",
19+
"koa-router": "^7.1.1",
20+
"koa-static": "^3.0.0",
21+
"koa-views": "^5.2.1",
22+
"pug": "^2.0.0-rc.1"
23+
},
24+
"devDependencies": {
25+
"@types/koa": "^2.0.48",
26+
"nodemon": "^1.8.1"
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
body {
2+
padding: 50px;
3+
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4+
}
5+
6+
a {
7+
color: #00B7FF;
8+
}

0 commit comments

Comments
 (0)