1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89## Crypto
### 什么是 SSL ?
Secure Sockets Layer,这是其全名,他的作用是协议,定义了用来对网络发出的数据进行加密的格式和规则。
```js
+------+ +------+
服务器 | data | -- SSL 加密 --> 发送 --> 接收 -- SSL 解密 -- | data | 客户端
+------+ +------+
+------+ +------+
服务器 | data | -- SSL 解密 --> 接收 <-- 发送 -- SSL 加密 -- | data | 客户端
+------+ +------+
```
> 注:TLS 1.0 等同于 SSL 3.1,TLS 1.1 等同于 SSL 3.2,TLS 1.2 等同于 SSL 3.3。
### OpenSSL
OpenSSL 是在程序上对 SSL 标准的一个实现,提供了:
* libcrypto 通用加密库
* libssl TLS/SSL 的实现
* openssl 命令行工具
Node.js 是完全采用 OpenSSL 进行加密的,其相关的 TLS HTTPS 服务器模块和 Crypto 加密模块都是通过 C++ 在底层调用 OpenSSL 。
OpenSSL 实现了对称加密:
```shell
AES(128) | DES(64) | Blowfish(64) | CAST(64) | IDEA(64) | RC2(64) | RC5(64)
```
非对称加密:
```shell
DH | RSA | DSA | EC
```
以及一些信息摘要:
```shell
MD2 | MD5 | MDC2 | SHA | RIPEMD | DSS
```
其中信息摘要是一些采用哈希算法的加密方式,也意味着这种加密是单向的,不能反向解密。这种方式的加密大多是用于保护安全口令,比如登录密码。这里面我们最长用的是 MD5 和 SHA (建议采用更稳定的 SHA1, MD5通过查表大法已经不再单向)。
使用非对称加密会损耗性能,对称加密又不能在网络传输,那该怎么办呢?
答案是:结合两者一起使用。`ssl/tls`实际上也是如此,`tls`将两者完美组合使用。
### TLS HTTPS 服务器
想要建立一个 Node.js TLS 服务器,需要使用 tls 模块:
`var Tls = require('tls');`
在开始搭建服务器之前,我们还有些重要的工作要做,那就是证书,签名证书。
基于 SSL 加密的服务器,在与客户端开始建立连接时,会发送一个签名证书。客户端在自己的内部存储了一些公认的权威证书认证机构,即 CA。客户端通过在自己的 CA 表中查找,来匹配服务器发送的证书上的签名机构,以此来判断面对的服务器是不是一个可信的服务器。
如果这个服务器发送的证书,上面的签名机构不在客户端的 CA 列表中,那么这个服务器很有可能是伪造的,你应该听说过“中间人攻击”。
```js
+------------+
| 真正的服务器 | 选择权:连接?不连接? +-------+
+------------+ +------------------ | 客户端 |
https | +-------+
+--------------+ | 拦截通信包
| 破坏者的服务器 | ----------+
+--------------+ 证书是伪造的
```
### 总结
加密技术的安全性和性能主要取决于以下几个关键因素:
1. **加密算法的选择**
不同的加密算法在安全性和性能上存在差异。对称加密算法(例如 AES-256)在性能上通常优于非对称加密,但它们需要安全的密钥交换方式。非对称加密算法(如 RSA、DSA 或 EC)虽然在密钥管理和交换上更为便捷,但由于计算量较大,通常只用于密钥交换或数字签名。在实际应用中,例如 TLS/SSL 协议,就巧妙地结合了两者的优势:利用非对称加密进行安全的密钥交换,再使用对称加密进行数据传输,从而既保证了安全性,也提高了性能。
2. **密钥长度与管理**
密钥(key)的长度直接影响加密强度。在相同的算法下,密钥长度每增加一位,暴力破解的难度呈指数级增长。当前,AES-256 被认为足够安全,而对于非对称加密来说,RSA 的 1024 位密钥已不再安全,推荐至少使用 2048 位密钥。此外,合理的密钥管理策略也是保障整个加密体系安全的重要环节。
3. **证书与身份验证**
在 TLS/SSL 协议中,服务器在建立连接时会向客户端发送签名证书,客户端则通过内置的权威 CA 列表对证书的签名机构进行验证。只有通过验证的证书才被视为可信,否则可能存在中间人攻击的风险。这一机制在确保通信双方身份真实可靠方面发挥着至关重要的作用。
4. **最新标准与实践**
随着技术的发展,安全标准也在不断更新。例如,TLS 1.2 和 TLS 1.3 相较于早期的 SSL/TLS 版本在安全性和性能上都有显著提升。采用最新的安全协议和算法,并定期更新和审查系统配置,可以有效防止潜在的安全漏洞和攻击。
综合来看,安全加密不仅依赖于算法本身的强度和密钥长度,还需要在实际应用中合理地结合对称与非对称加密技术,以及配合严格的身份验证与证书管理策略。只有这样,才能在确保数据传输安全的同时,兼顾加密性能,构建一个既高效又安全的通信系统。
### 参考
* http://www.jianshu.com/p/a8b87e436ac7