在实时音视频互动过程中,你需要对媒体流和信令加密,从而保障用户的数据安全。声网 RTSA Lite SDK 提供内置加密方案,可以对 RTC 的音视频数据包和 RTM 的消息数据包进行加密。
声网 RTSA Lite SDK 的加密原理如下:
RTSA Lite SDK 目前支持以下加密模式:
在启用媒体流和信令加密前,请确保已在你的项目中实现基本的实时音视频功能。
参考以下步骤分别生成并设置密钥和盐。
GCM2
加密模式使用了安全性更高的密钥派生函数且支持盐。如果你选择其他加密模式,则只需设置加密模式和密钥。在你的服务端生成 32 字节的密钥。参考以下命令通过 OpenSSL 随机生成 32 字节的密钥。
# 随机生成一个 32 字节的密钥
openssl rand -hex 32
dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453
客户端从服务端获取密钥,并在调用 agora_rtc_set_params
(C API)或 setParams
(Java API)时通过 master_key
私有参数传入 SDK。
在你的服务端,参考以下命令通过 OpenSSL 随机生成 Base64 编码、32 字节的盐。你也可以参考声网在 GitHub 上提供的 C++ 示例代码,在服务端随机生成 byte array 型的盐,然后转换成 Base64 编码。
# 随机生成一个 Base64 编码、32 字节的盐
openssl rand -base64 32
65s+xWRK7TvUKwx4PTjS0J0Y5J7mKhsbdawF43Ao1lo=
客户端从服务端获取 Base64 编码的盐。
客户端将盐传入 agora_rtc_set_params
(C API)或 setParams
(Java API)的 salt
私有参数。
在调用 agora_rtc_join_channel
(C API)方法或 joinChannel
(Java API)方法加入频道时,使用 options.enable_encrypt
(C API)或 options.enableEncrypt
(Java API)参数开启内置加密。
// C
rtc_channel_options_t channel_options;
...
channel_options.enable_aut_encryption = true;
// 加入 RTC 频道
rval = agora_rtc_join_channel(g_conn_id, DEFAULT_CHANNEL_NAME, DEFAULT_USER_ID, DEFAULT_TOKEN, &channel_options);
if (rval < 0) {
printf("Failed to join channel \"%s\", reason: %s\n", DEFAULT_CHANNEL_NAME, agora_rtc_err_2_str(rval));
return -1;
}
// Java
ChannelOptions chnlOption = new ChannelOptions();
...
chnlOption.enableAutEncryption = true;
ret = mRtcService.joinChannel(CONN_ID, CHANNEL_NAME, RTC_HOST_USER_ID, RTC_TOKEN,
chnlOption);
调用 agora_rtc_set_params
(C API)或 setParams
(Java API)设置私有参数进行加密。以 C 接口为例:
// C
// 客户端从服务端获取密钥并传入 master_key
// 开启 SM4 加密
agora_rtc_set_params("{\"rtc.encryption\": {\"enable\": true,\"mode\":\"SM4-128-ECB\", \"master_key\": \"dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453\"}}");
// 开启 AES-128-GCM 加密
// 客户端从服务端获取密钥并传入 master_key
agora_rtc_set_params("{\"rtc.encryption\": {\"enable\": true, \"mode\": \"AES-128-GCM\", \"master_key\": \"dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453\"}}");
// 开启 AES-128-GCM2 加密
// 客户端从服务端获取密钥并传入 master_key
// 客户端从服务端获取盐,再传入 salt。salt_type 设为 BASE64。
agora_rtc_set_params("{\"rtc.encryption\": {\"enable\": true, \"mode\": \"AES-128-GCM2\", \"master_key\": \"dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453\", \"salt\": \"65s+xWRK7TvUKwx4PTjS0J0Y5J7mKhsbdawF43Ao1lo=\", \"salt_type\": \"BASE64\"}}");
// 关闭 SDK 内置加密
agora_rtc_set_params("{\"rtc.encryption\": {\"enable\": false }");