2024/10/17 14:17:33
媒体流加密
媒体流加密是指通过由 App 开发者控制的唯一的密钥和盐为 App 中的音视频流加密。声网提供媒体流加密功能以确保传输过程中数据的保密性,建议你根据实际的业务场景合理应用。
本文介绍如何在你的 App 中添加声网内置媒体流加密。
技术原理
下图描述了启用媒体流加密后的数据传输流程。声网推荐使用 AES_128_GCM2
或 AES_256_GCM2
加密模式,并设置密钥和盐。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,为你的 App 添加内置媒体流加密功能:
-
在你的服务端生成一个密钥和盐。
-
在你的服务端,参考以下命令,通过 OpenSSL 随机生成 32 字节的 16 进制数值,并以字符串的形式作为密钥使用:
Shell# 随机生成一个密钥
openssl rand -hex 32
dba643c8ba6b6dc738df43d9fd624293b4b12d87a60f518253bd10ba98c48453 -
在你的服务端,参考以下命令,通过 OpenSSL 随机生成 Base64 编码、32 字节的盐:
Shell# 随机生成一个 Base64 编码、32 字节的盐
openssl rand -base64 32
X5w9T+50kzxVOnkJKiY/lUk82/bES2kATOt3vBuGEDw=
-
-
实现客户端逻辑:
-
从服务端获取 String 型的密钥和 Base64 编码的盐。
-
将盐从 Base64 转换成 uint8_t。
-
加入频道前,调用
enableEncryption
设置AES_128_GCM2
或AES_256_GCM2
加密模式,并将密钥和盐传入 SDK。
-
注意
- 同一频道内所有用户必须使用相同的加密模式、密钥和盐。否则,可能会出现黑屏或音频丢失等未定义行为。
- 为确保安全性,声网建议在每次启用媒体流加密前使用新的密钥和盐。
以下示例代码展示了该逻辑的实现过程:
TypeScript
// 开启内置加密
enableEncryption = () => {
// 内置加密模式为 Aes128Xts
const encryptionMode = EncryptionMode.Aes128Xts;
// 内置加密密钥
const encryptionKey = '';
// 盐
const encryptionKdfSalt = new Array(32).fill(1, 0, 32);
if (!encryptionKey) {
this.error("encryptionKey is invalid");
return;
}
rtcEngine.enableEncryption(true, {
encryptionMode,
encryptionKey,
encryptionKdfSalt,
});
};
// 关闭内置加密
disableEncryption = () => {
rtcEngine.enableEncryption(false, {});
};
参考信息
示例项目
声网提供了开源的媒体流加密示例项目供你参考,你可以前往下载或查看其中的源代码。
注意事项
如需与 Web 平台的音视频 SDK 互通,你还需要将本文提到的 String 型密钥从 Hex 编码格式转换成 ASCII 编码格式。