Shadowsocks Windows客户端依赖于两个原生加密库来提供安全的加密功能:libsodium 和 mbedTLS。这些库提供了各种加密原语,供更高级别的加密框架使用,以保护客户端和服务器之间的网络流量。有关这些库如何集成到加密框架的更多信息,请参阅加密框架。
Shadowsocks Windows客户端使用一个名为libsscrypto.dll的自定义原生库,该库结合了libsodium和mbedTLS的功能。此库作为资源嵌入到应用程序中,并在运行时解压到临时位置。
来源:shadowsocks-csharp/Encryption/Sodium.cs1-113 shadowsocks-csharp/Encryption/MbedTLS.cs1-109
这两个库都遵循类似的初始化模式,即在包装器类的静态初始化期间提取并加载原生DLL。
来源:shadowsocks-csharp/Encryption/Sodium.cs22-55 shadowsocks-csharp/Encryption/MbedTLS.cs20-35
Sodium 包装器提供了对 libsodium 加密函数的访问,尤其侧重于 AEAD(带关联数据的认证加密)密码和流密码。这些原语构成了 Shadowsocks 客户端和服务器之间安全通信通道的基础。
AEAD 密码提供数据的机密性和真实性。支持以下 AEAD 密码:
| 密码名称 | 功能 |
|---|---|
| ChaCha20-Poly1305 IETF | crypto_aead_chacha20poly1305_ietf_encrypt/decrypt |
| XChaCha20-Poly1305 IETF | crypto_aead_xchacha20poly1305_ietf_encrypt/decrypt |
| AES-256-GCM | crypto_aead_aes256gcm_encrypt/decrypt |
AES-256-GCM 密码的可用性在运行时检测,因为它可能并非在所有硬件平台上都受支持。
来源:shadowsocks-csharp/Encryption/Sodium.cs66-95
流密码用于加密数据流。支持以下流密码:
| 密码名称 | 功能 |
|---|---|
| Salsa20 | crypto_stream_salsa20_xor_ic |
| ChaCha20 | crypto_stream_chacha20_xor_ic |
| ChaCha20 IETF | crypto_stream_chacha20_ietf_xor_ic |
这些函数允许使用提供的密钥、随机数和计数器值对数据进行加密和解密。
来源:shadowsocks-csharp/Encryption/Sodium.cs97-111
MbedTLS 包装器提供了对 mbedTLS 库中各种加密操作的访问。它提供了哈希、通用密码操作和密钥派生功能。
MbedTLS 提供了一个 MD5 哈希函数,该函数用于多种目的,包括某些加密方法中的密钥派生。
来源:shadowsocks-csharp/Encryption/MbedTLS.cs37-43
MbedTLS 提供了一个支持各种分组密码的底层密码 API。该 API 遵循以下模式:
来源:shadowsocks-csharp/Encryption/MbedTLS.cs58-86
MbedTLS 提供了 HKDF(基于 HMAC 的密钥派生函数)的实现,该函数用于从输入密钥材料中派生安全的加密密钥。
此功能对于需要从单个共享密钥派生多个密钥的协议尤其重要。
来源:shadowsocks-csharp/Encryption/MbedTLS.cs102-105
加密库是 Shadowsocks 代理机制中的关键组成部分。当客户端通过 Shadowsocks 启动连接时,数据会先使用所选密码进行加密,然后发送到远程服务器。
来源:shadowsocks-csharp/Encryption/Sodium.cs1-113 shadowsocks-csharp/Encryption/MbedTLS.cs1-109
Sodium 库内置了硬件加速能力的检测,特别是针对 AES-256-GCM 密码。这使得应用程序能够最佳地利用可用硬件。
当硬件加速可用时,使用 AES-256-GCM 密码的操作将显著加快,从而提高整体代理性能。
来源:shadowsocks-csharp/Encryption/Sodium.cs51-52
两个库包装器都包含初始化失败和操作失败的错误处理功能。
MD5()这样的函数会检查原生函数的返回值,如果操作失败则抛出异常。这确保了加密操作要么正确执行,要么明确失败,这对于安全性至关重要。
来源:shadowsocks-csharp/Encryption/Sodium.cs33-45 shadowsocks-csharp/Encryption/MbedTLS.cs31-42
加密库提供了 Shadowsocks 代理中安全通信所需的加密原语。通过结合 libsodium(用于现代 AEAD 密码)和 mbedTLS(用于传统密码和加密操作)的优势,Shadowsocks 提供了具有良好性能特点的强大加密选项。
这些库是实现 Shadowsocks 协议支持的各种密码方法的高级加密框架的基础。