在实时音视频互动过程中,你需要对媒体流加密,从而保障用户的数据安全。声网提供内置加密方案,使用 SDK 预置的加密模式给媒体流加密。
下图描述了启用媒体流加密后的数据传输流程:
我们在 GitHub 上提供已实现内置加密功能的开源示例项目。你可以下载体验并参考源代码。
在启用媒体流加密前,请确保已参考《快速开始》文档在你的项目中实现基本的音视频通话或直播功能。
在加入频道前,调用 EnableEncryption
方法启用内置加密。
自 v3.4.5 起,声网推荐使用 AES_128_GCM2
或 AES_256_GCM2
加密模式,并设置密钥和盐。
参考以下步骤分别生成并设置密钥和盐。
GCM2
加密模式使用了安全性更高的密钥派生函数且支持盐。如果你选择其他加密模式,则只需设置加密模式和密钥。在你的服务端,参考以下命令通过 OpenSSL 随机生成 String 型、32 字节的密钥。你也可以参考声网在 GitHub 上提供的 C++ 示例代码,在服务端随机生成 byte array 型的盐,然后转换成 Base64 编码。
// 随机生成一个 string 型、32 字节的密钥,并将该密钥传入 EnableEncryption 的 encryptionKey 参数。
openssl rand -hex 32
dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453
客户端从服务端获取 String 型密钥,并在调用 EnableEncryption
时传入 SDK。
在你的服务端,参考以下命令通过 OpenSSL 随机生成 Base64 编码、32 字节的盐。
// 随机生成一个 Base64 编码、32 字节的盐,并将该盐传入 EnableEncryption 的 encryptionKdfSalt 参数。
openssl rand -base64 32
X5w9T+50kzxVOnkJKiY/lUk82/bES2kATOt3vBuGEDw=
客户端从服务端获取 Base64 编码的盐。
客户端将盐从 Base64 转换成 UTF8,然后在调用 EnableEncryption
时传入 SDK。
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using agora_gaming_rtc;
// 获取在服务端生成的密钥和盐
bool GetSecretAndSaltFromSever(out string secret, out string kdfSaltBase64)
int EnableEncryption()
{
var secret = "";
var kdfSaltBase64 = "";
if (!GetSecretAndSaltFromSever(out secret, out kdfSaltBase64))
return -1;
if (mRtcEngine != null)
{
var config = new EncryptionConfig
{
// 设置加密模式为 AES_128_GCM2
encryptionMode = ENCRYPTION_MODE.AES_128_GCM2,
// 设置密钥
encryptionKey = secret,
// 设置盐,你需要将盐从 Base64 转换成 UTF8
encryptionKdfSalt = Convert.FromBase64String(kdfSaltBase64)
};
// 启用内置加密
return mRtcEngine.EnableEncryption(true, config);
}
return -1;
}