功能介绍
在金融等对用户隐私数据要求严苛的行业场景中,为确保用户数据在网络传输中的安全性,以及保障用户信息与数据的绝对安全,常需额外采用媒体流加密手段。实时音视频 TRTC 在既有的默认加密算法基础上,更进一步提供了媒体流私有加密能力,从而为用户数据的安全性提供坚实屏障。
前提条件
因合规管理要求,开后 SDK 私有加密能力需进行业务信息审核 提交申请,我们将在一个工作日内完成审核,审核通过后即可接入使用(申请开通的 SDKAppid 需订阅旗舰版套餐服务)。
注意事项
使用私有加密的 TRTC 音视频通话房间,不支持使用云端录制、旁路推流等媒体服务,不支持服务端本地录制服务。
当前仅限 iOS、Android、Windows、macOS 支持,其他平台暂不支持。
实现流程
使用私有加密方案
在加入房间前,调用
enablePayloadPrivateEncryption
方法启用私有加密,请参见以下步骤分别生成并设置密钥和盐。注意:
同一房间内所有用户必须使用相同的加密模式、密钥和盐。
用户退出房间后,SDK 会自动关闭私有加密。如需重新开启私有加密,您需要在用户再次加入房间前调用该方法。
生成并设置密钥
1. 在您的服务端,参见以下命令通过 OpenSSL 随机生成 String 型的密钥。
// 随机生成一个 string 型、16 字节或 32 字节的密钥,并将该密钥传入 TRTCPayloadPrivateEncrypopenssl rand -hex 16a2e898d07a304246044f899a16123263openssl rand -hex 328301281ec074a4cb2bd31aa40ad795d15a190d56fb73408db91244c5a3f90a2d
注意:
生成的密匙长度在于您选择的加密算法,若您选择的加密算法为 TRTCEncryptionAlgorithmAes128Gcm ,需生成16字节的密匙,若您选择的加密算法为 TRTCEncryptionAlgorithmAes256Gcm ,需生成 32 字节的密匙。
2. 客户端从服务端获取 String 型密钥,并在调用
enablePayloadPrivateEncryption
时传入 SDK。生成并设置盐
1. 在您的服务端,参见以下命令通过 OpenSSL 随机生成 Base64 编码、32 字节的盐。
// 随机生成一个 Base64 编码、32 字节的盐,并将该盐传入 TRTCPayloadPrivateEncryptionConfigopenssl rand -base64 323ZZ0nV/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; }