自定义加解密
在实时音视频互动中,开发者可选择对媒体流进行加密,从而保障用户的数据安全。融云提供两套加密方案:
- SDK 内置 SRTP 安全实时传输协议,即协议层的标准加密方式。以开关形式提供,使用简单。
- 开发者对媒体数据的自定义加密。即加解密完全由开发者实现,融云服务只对数据做转发,适用于对安全性有特殊要求的客户。此类加密方式,服务端无法做合流处理,所以不适用于直播。
- 使用自定义加密后,无法使用部分 RTC 服务端功能,包括:云端录制、云端截图、内容审核、云播放器。
提示
- 若使用自定义加密,需要确保发送端和接收端的加解密算法一致,否则会无法正常通话。
- 自定义加密,可分别针对音频或视频的原始数据执行,音频和视频的加密算法可以独立设置,或对其中之一进行设置。
注意:无论何种加密方式,都会对客户端、服务器造成额外的资源消耗,在低性能设备上可能会影响体验。
SRTP 加密
加入音视频房间前,在 Config 中打开 SRTP 开关即可。
-
示例代码:
Objective C[RCRTCEngine sharedInstance].config.enableSRTP = YES;
自定义加密
步骤 1:实现自定义加解密代理
SDK 在 RCRTCCryptoDelegate.h
文件中提供了 RCRTCCustomizedEncryptorDelegate
和 RCRTCCustomizedDecryptorDelegate
这两个加解密代理,开发者可以通过它们取得需要加解密的媒体流,在对应的方法中实现加解密媒体流。
-
加密示例代码:
Objective C- (int)EncryptPayloadData:(const uint8_t *)payloadData
payloadSize:(size_t)payloadSize
encryptedFrame:(uint8_t *)encryptedFrame
bytesWritten:(size_t *)bytesWritten
mediastreamId:(NSString *)mediastreamId
mediaType:(int)mediatype {
uint8_t fake_key_ = 0x88;
for (size_t i = 0; i < payloadSize; i++) {
encryptedFrame[i] = payloadData[i] ^ fake_key_;
}
*bytesWritten = payloadSize;
return 0;
}
- (size_t)GetMaxCiphertextByteSize:(size_t)frameSize
mediastreamId:(NSString *)mediastreamId
mediaType:(int)mediatype {
return frameSize;
} -
解密示例代码:
Objective C- (int)DecryptFrame:(const uint8_t *)encryptedFrame
frameSize:(size_t)encryptedFrameSize
frame:(uint8_t *)frame
bytesWritten:(size_t *)bytesWritten
mediastreamId:(NSString *)mediastreamId
mediaType:(int)mediatype {
uint8_t fake_key_ = 0x88;
for (size_t i = 0; i < encryptedFrameSize; i++) {
frame[i] = encryptedFrame[i] ^ fake_key_;
}
*bytesWritten = encryptedFrameSize;
return 0;
}
- (size_t)GetMaxPlaintextByteSize:(size_t)frameSize
mediastreamId:(NSString *)mediastreamId
mediaType:(int)mediatype {
return frameSize;
} -
API 参考:
步骤 2:设置代理
-
示例代码:
Objective Ccrypto = [[MeetingCryptoImpl alloc] init];
[[RCRTCEngine sharedInstance] setAudioCustomizedDecryptorDelegate:self.cryptoImpl];
[[RCRTCEngine sharedInstance] setAudioCustomizedEncryptorDelegate:self.cryptoImpl];
[[RCRTCEngine sharedInstance] setVideoCustomizedDecryptorDelegate:self.cryptoImpl];
[[RCRTCEngine sharedInstance] setVideoCustomizedEncryptorDelegate:self.cryptoImpl];