媒体流加密

更新时间不可用

了解如何在 RTC 服务端 SDK 中媒体流加密,包括适用场景、配置步骤、实现要点和注意事项。

功能描述

在实时音视频互动过程中,你需要对媒体流加密,从而保障用户的数据安全。RTC 服务端 SDK 提供内置加密方案。

实现方法

自 3.8.200 版本起,声网推荐使用 AES_128_GCM2 或 AES_256_GCM2 加密模式,并设置密钥和盐。3.8.200 之前的版本仅支持 128-bit SM4, ECB 模式。

参考以下步骤分别生成并设置密钥和盐。

注意

  • 同一频道内所有用户必须使用相同的加密模式、密钥和盐。
  • 相比于其他加密模式,GCM2 加密模式使用了安全性更高的密钥派生函数且支持盐。如果你选择其他加密模式,则只需设置加密模式和密钥。

生成并设置密钥

  1. 在你的服务端,参考以下命令通过 OpenSSL 随机生成 String 型、32 字节的密钥。
Shell
# 随机生成一个 string 型、32 字节的密钥,并将该密钥传入 enableEncryption 的 encryptionKey 参数。
openssl rand -hex 32
dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453
  1. 客户端从服务端获取 String 型密钥,并在调用 enableEncryption 时传入 SDK。

生成并设置盐

  1. 在你的服务端,参考以下命令通过 OpenSSL 随机生成 Base64 编码、32 字节的盐。你也可以参考声网在 GitHub 上提供的 C++ 示例代码,在服务端随机生成 byte array 型的盐,然后转换成 Base64 编码。
Shell
# 随机生成一个 Base64 编码、32 字节的盐,并将该盐传入 enableEncryption 的 encryptionKdfSalt 参数。
openssl rand -base64 32
X5w9T+50kzxVOnkJKiY/lUk82/bES2kATOt3vBuGEDw=
  1. 客户端从服务端获取 Base64 编码的盐。

  2. 客户端将盐值从 Base64 编码解码为长度为 32 的 uint8_t 数组,然后在调用 enableEncryption 时传入 SDK。

调用 enableEncryption 开启加密

连接频道之前,调用 enableEncryption 开启内置加密。你还需要设置加密模式和秘钥。在同一频道的用户必须使用相同的加密模式和秘钥。

C++
// Create EncryptionConfig object
agora::rtc::EncryptionConfig Config;
// 256-bit AES, GCM2 mode
Config.encryptionMode = agora::rtc::AES_256_GCM2;
// Set encryption key
Config.encryptionKey = options.encryptionKey.c_str();
// Set encryption salt
Config.encryptionKdfSalt = options.encryptionKdfSalt;
// Enable built-in encryption
if (connection->enableEncryption(options.encryptionMode, Config) < 0) {
    AG_LOG(ERROR, "Failed to enable encryption!");
}
AG_LOG(INFO, "Enable encryption successfully");