在前端开发的世界中,Web API 是连接内外不同应用程序的最常见方式,其中最普遍的 API 风格是 RESTful API。由于 RESTful API 的开放性,服务端返回的数据可能会在网络传输和存储过程中遭到攻击者的窃取和篡改,因此对因应用程序返回的数据进行加密变得愈发重要。本文将着重介绍 RESTful API 中的数据加密技巧。
数据加密的重要性
在进行网络通信时,通过加密保护传输数据时非常必要的,主要有以下原因:
- 保护个人隐私及数据安全。
- 防止攻击者篡改或窃取数据。
- 防止数据泄露。
基本的加密算法
下面介绍两个常见的加密算法。
对称加密算法
对称加密算法是指加密密钥和解密密钥相同的加密算法,这意味着加密和解密的过程都可以在不同的程序之间进行,只需共享同一个密钥即可。因为传输的数据和加密密钥和解密密钥都在服务器端和客户端中,这种算法在未进行前,仍然会有数据泄露的隐患。因此,应采用一些保护这些密钥的加密措施。
常见的对称加密算法有很多,其中包括 DES、AES 和 Blowfish 等。在实际应用中,我们更倾向于选择 AES 加密算法。
非对称加密算法
非对称加密算法是一种公钥加密算法。这种算法需要两个密钥:一个用于加密数据,另一个用于解密数据。这些密钥称为公钥和私钥,公钥通常被发送到意图接收网络数据的所有人。数据如果需要解密,则必须使用对应的私钥。
常见的非对称加密算法包括 RSA、DSA 和 ECC 等。在实际开发应用中,我们通常选择 RSA 加密算法进行网络数据的加密、解密和验证。
基于以上介绍的加密算法,我们可以将其应用到 RESTful API 数据传输时,从而保证数据安全。
1.为请求生成令牌
使用令牌验证是保护数据的常见方式之一。通过令牌验证,请求方可以获得保护账户或数据的访问权限。当前市场上流行的一些云 API 提供商,如 Microsoft Azure、Amazon Web Services 和 Google Cloud,都支持令牌验证功能。RESTful API 中的请求可以通过令牌验证进行安全保护,从而防止未获授权的访问。
下面我们以 JWT(JSON Web Token)生成令牌为例,让我们来了解如何生成请求令牌,并且如何保留令牌。
生成 JWT 令牌
//引入 const jwt = require('jsonwebtoken'); // 生成 JWT 加密令牌 let token = jwt.sign({ id: '001', // 客户 ID name: 'Bill' // 客户名称 }, 'mysecret', { expiresIn: 3600 });
第一个参数对应的是客户 id 和客户名称,第二个是秘钥,第3个是我们的一个加密规则,我们可以任意指定。
保留 JWT 令牌
如果您选择 JWT 进行加密,这个令牌应该尽可能地保留在服务器上。当客户端向网站发送具有 JWT 的请求时,Web 应用程序可以处理请求并验证该用户是否有权限进行请求。在经过身份验证后,Web 应用程序可以执行已请求的操作,然后以该用户的身份返回数据。
在服务器端将 JWT 存储在:localStorage
中可能会导致 CSRF(跨站点请求伪造)和 XSS(跨站点脚本攻击)(点此链接https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#Security限于不具体展开,这里不讨论)风险。因此,在使用 JWT 的情况下建议在 cookie 中保存 JWT 信息。然而,在安全方面,即使是在 cookie 中进行 JWT 存储,您也必须了解掌握常见的应对 CSRF、XSS 攻击的方法。
2. SSL / TLS 加密
SSL(Secure Sockets Layer)是一种名为 Netscape 网络安全卡的协议,用于在各种网络应用程序之间提供安全通信。SSL 传输协议通过使用对称加密算法或公钥算法来加密数据。
而 TLS(Transport Layer Security)就是在 SSL 的基础上发展出来的一种更加安全的协议。因此,在配置网络协议时,可以优先考虑使用 TLS 代替 SSL。
你可以在以下场景中使用 SSL / TLS 加密:
- 与安全 SMTP / POP3 认证服务器交互;
- 与加密 IMAP(Internet Mail Access Protocol)邮件服务器交互;
- 在使用 Skype、VoIP、视频聊天等应用程序时,使用 SSL / TLS 通信。
AES 加密算法
上文提到了 AES 加密算法,这里将更加详细地介绍 AES 加密算法。
AES 模式
AES(Advanced Encryption Standard)是一种对称加密算法,它支持不同的区块加密模式。最常用的几种区块加密模式如下:
ECB(Electronic Code Book):对称加密数据包分成多个小块,每个块都使用同样的加密密钥进行加密,这样即使有攻击者拦截了一些加密块,仍无法破解密文。
CBC(Cipher Block Chaining):此模式下加密的数据是连续的块。此模式下加密过程如下:每个块经过初始向量(IV)处理后,使用前一块的密文与当前块的明文异或运算产生的结果做加密运算。IV 是在加密中首个初始向量。这种算法是当前最常用的加密模式。
CFB(Cipher-Feedback):CFB 模式的加密算法基于一组 指定的位数 进行加密。<del>该算法并不是由国际安全计算机机构所推荐的</del>,安全性与 CBC 模式相同,但操作效率更高。
使用 AES 加密解密
下面我们可以通过代码来演示 AES 默认使用的 CBC 模式进行加密。
-- -------------------- ---- ------- ----- ------ - ------------------ ----- --------- - -------------- ----- -------------- - ---------- --------------- - ------ -- - ----- ------ - -------------------------------- --------------- ---------------- ---- --- --------- - ------------------- -------- ------- --------- -- -------------------- ------ ---------- -- --------------- - ------ -- - ----- -------- - ---------------------------------- --------------- ---------------- ---- --- --------- - --------------------- ------ --------- --------- -- ------------------------ ------ ---------- --
我们可以使用上面的函数进行加密和解密。
const aes = require('./amAes'); const str = 'Amos-lin'; // 加密的字符串 const enStr = aes.encrypt(str); const deStr = aes.decrypt(enStr); console.log('加密后:', enStr); console.log('解密后:', deStr);
运行结果:
加密后: 91c01fa575a525d5978e522061a64a12 解密后: Amos-lin
结论
在如今网络规模扩大、攻击手法日趋复杂的时代,加密技术显得更加重要,特别是在 RESTful API 数据传输和存储时。在开发过程中深入学习和了解数据加密技术,选择适合自己的加密算法,加密模式以及抵御攻击的措施,可以从根本上增强数据保护。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6732a8e80bc820c5823e30fa