媒体流私有加密

功能介绍

在金融等对用户隐私数据要求严苛的行业场景中,为确保用户数据在网络传输中的安全性,以及保障用户信息与数据的绝对安全,常需额外采用媒体流加密手段。实时音视频 TRTC 在既有的默认加密算法基础上,更进一步提供了媒体流私有加密能力,从而为用户数据的安全性提供坚实屏障。

前提条件

登录 TRTC 控制台,开通 TRTC 服务并 创建应用
前往 TRTC 购买页,针对需要使用加密能力的 SDKAppid 购买 RTC-Engine 专业版包月套餐,以解锁 SDK 私有加密能力位。包月套餐相关说明请参见文档 包月套餐计费说明
因合规管理要求,开后 SDK 私有加密能力需进行业务信息审核,如有需求,可提交工单进行服务申请。

注意事项

使用私有加密的 TRTC 音视频通话房间,不支持使用云端录制、旁路推流等媒体服务,不支持服务端本地录制服务。
当前仅限 iOS、Android、Windows、macOS 支持,其他平台暂不支持。

实现流程

使用私有加密方案

在加入房间前,调用enablePayloadPrivateEncryption方法启用私有加密,请参见以下步骤分别生成并设置密钥和盐。
注意:
同一房间内所有用户必须使用相同的加密模式、密钥和盐。
用户退出房间后,SDK 会自动关闭私有加密。如需重新开启私有加密,您需要在用户再次加入房间前调用该方法。

生成并设置密钥

1. 在您的服务端,参见以下命令通过 OpenSSL 随机生成 String 型的密钥。
// 随机生成一个 string 型、16 字节或 32 字节的密钥,并将该密钥传入 TRTCPayloadPrivateEncryp
openssl rand -hex 16
a2e898d07a304246044f899a16123263

openssl rand -hex 32
8301281ec074a4cb2bd31aa40ad795d15a190d56fb73408db91244c5a3f90a2d
注意:
生成的密匙长度在于您选择的加密算法,若您选择的加密算法为 TRTCEncryptionAlgorithmAes128Gcm ,需生成16字节的密匙,若您选择的加密算法为 TRTCEncryptionAlgorithmAes256Gcm ,需生成 32 字节的密匙。
2. 客户端从服务端获取 String 型密钥,并在调用enablePayloadPrivateEncryption时传入 SDK。

生成并设置盐

1. 在您的服务端,参见以下命令通过 OpenSSL 随机生成 Base64 编码、32 字节的盐。
// 随机生成一个 Base64 编码、32 字节的盐,并将该盐传入 TRTCPayloadPrivateEncryptionConfig
openssl rand -base64 32
3ZZ0nV/rDVUzTa6tXyz+F7rrUYIcxRqX5fiUto/FbZA=
2. 客户端从服务端获取 Base64 编码的盐。
3. 客户端将盐值从 Base64 编码解码为长度为 32 的 uint8_t 数组,然后在调用enablePayloadPrivateEncryption时传入SDK。

示例代码

#include <boost/archive/iterators/binary_from_base64.hpp> #include <boost/archive/iterators/transform_width.hpp> #include <string> #include <vector> #include <algorithm> #include <stdint.h> #include "ITRTCCloud.h" liteav::ITRTCCloud* trtcCloud; // 获取在服务端生成的密钥和盐 bool getKeyAndSaltFromSever(std::string& secret, std::string& saltBase64); // 声明一个工具函数,用于将 Base64 转换成 uint8_t bool decodeBase64(const std::string& input, std::vector<uint8_t>& output) { output.resize(32); typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<std::string::const_iterator>, 8, 6> Base64DecodeIterator; try { std::copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), output.begin()); } catch (...) { return false; } return true; } int enablePayloadPrivateEncryption() { std::string key; std::string saltBase64; std::vector<uint8_t> salt; if(!getKeyAndSaltFromSever(key, saltBase64)) return -1; if(trtcCloud && decodeBase64(saltBase64, salt)) { liteav::TRTCPayloadPrivateEncryptionConfig config; // 设置加密算法为 TRTCEncryptionAlgorithmAes128Gcm config.encryptionAlgorithm = TRTCEncryptionAlgorithm::TRTCEncryptionAlgorithmAes128Gcm; // 设置密钥 config.encryptionKey = key.c_str(); // 设置盐 memcpy(config.encryptionSalt, salt.data(), sizeof(config.encryptionSalt)); // 启用私有加密 return trtcCloud->enablePayloadPrivateEncryption(true, config); } return -1; }