iOS

# 加密传输

为了建立安全通道,就是通信双方建立连接通道后,在这个通道中传递的信息不可被第三方窃取,或者即使窃取后,也不能识别信息内容。但是仅通信双方建立安全通道是不够的,还需要进行合法性确认。通常终端的合法性是基于用户名密码实现的,即服务器通过客户端提交的用户名和密码来进行鉴权,确认此用户的合法性。

在建立安全通道以及身份合法性验证后,后续大量的信息交互需要高效率的加密和解密,通常我们会使用对称加密方式进行处理。

# 1. 国密加密

  • 国密 SM4 分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。
  • 要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4 算法与 AES 算法具有相同的密钥长度分组长度128比特,因此在安全性上高于 3DES 算法。

在登录的接口参数里设置 CA 证书(Certificate)和账户分录(AccountEntry)。

通过 certificate (opens new window) 设置 base64 编码后的证书字符串,通过 accountEntry (opens new window) 设置账户分录。

示例代码:

//证书路径
NSString *caPath = [[NSBundle mainBundle] pathForResource:@"CA" ofType:@"der"];
//证书内容
NSData *data = [[NSFileManager defaultManager] contentsAtPath:caPath];
NSString *ca = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
param.certificate = ca;
param.accountEntry = @"AccountEntry:sarc -h arc@AccountEntry -p 198 -S 3;";
[_client login:@"123" password:@"123" loginParam:param];//证书路径
NSString *caPath = [[NSBundle mainBundle] pathForResource:@"CA" ofType:@"der"];
//证书内容
NSData *data = [[NSFileManager defaultManager] contentsAtPath:caPath];
NSString *ca = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
param.certificate = ca;
param.accountEntry = @"AccountEntry:sarc -h arc@AccountEntry -p 198 -S 3;";
[_client login:@"123" password:@"123" loginParam:param];

在呼叫时设置加密方式 SecurityType (opens new window)

示例代码:

JRTCCallCenterCallParam *param = [[JRTCCallCenterCallParam alloc] init];
param.securityType = SecurityTypeSm4;
[agent recall:@"10086" callParams:callParam];JRTCCallCenterCallParam *param = [[JRTCCallCenterCallParam alloc] init];
param.securityType = SecurityTypeSm4;
[agent recall:@"10086" callParams:callParam];

# 2. Token校验

token 认证服务,主要用于登录时 token 验证,由第三方服务获取 token ,将 token 下发给集成的终端,由 SDK 发起登录时带上 token ,进行认证。

详见 token 流程介绍 (opens new window)

允许用户登录时,带入 token 。如果未使用,可以不带。

/**
 * 登录 Juphoon RTC 平台,只有登录成功后才能进行平台上的各种业务
 * 登录结果通过 {@link JRTCClientCallback.onLogin:reason: onLogin} 回调通知
 *
 * @param userId 用户ID
 * @param password 密码,不能为空
 * @param loginParam      登录参数,一般不需要设置,如需设置请询问客服,传 nil 则按默认值,详见 @ref JRTCClientLoginParam
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 * @warning 目前只支持免鉴权模式,服务器不校验账号密码,免鉴权模式下当账号不存在时会自动去创建该账号
 * @warning 用户名为英文数字和'+' '-' '_' '.',长度不要超过64字符,'-' '_' '.'不能作为第一个字符
 */
- (bool)login:(NSString* _Nonnull)userId password:(NSString* _Nonnull)password loginParam:(JRTCClientLoginParam* _Nullable)loginParam;/**
 * 登录 Juphoon RTC 平台,只有登录成功后才能进行平台上的各种业务
 * 登录结果通过 {@link JRTCClientCallback.onLogin:reason: onLogin} 回调通知
 *
 * @param userId 用户ID
 * @param password 密码,不能为空
 * @param loginParam      登录参数,一般不需要设置,如需设置请询问客服,传 nil 则按默认值,详见 @ref JRTCClientLoginParam
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 * @warning 目前只支持免鉴权模式,服务器不校验账号密码,免鉴权模式下当账号不存在时会自动去创建该账号
 * @warning 用户名为英文数字和'+' '-' '_' '.',长度不要超过64字符,'-' '_' '.'不能作为第一个字符
 */
- (bool)login:(NSString* _Nonnull)userId password:(NSString* _Nonnull)password loginParam:(JRTCClientLoginParam* _Nullable)loginParam;