一、语音密钥后台部署
腾讯云游戏多媒体引擎提供鉴权密钥,用于实时语音及离线语音的鉴权,此文档为后台部署方案。
鉴权所用到的签名产生过程涉及到明文、密钥和算法。
二、明文
明文为以下字段的网络序拼接:
| 字段描述 | 类型/长度 | 值定义/备注 |
| cVer | unsigned char(1) | 版本号,填写数值:1。 |
| wOpenIDLen | unsigned short(2) | 用户的账号长度。 |
| strOpenID | string | 用户的账号字符。 |
| dwSdkAppid | unsigned int(4) | 开发者的 SDKappid。 |
| dwReserved1 | unsigned int(4) | 填写数值:0。 |
| dwExpTime | unsigned int(4) | 过期时刻(当前时间 + 有效期(单位:秒,建议300秒)) |
| dwReserved2 | unsigned int(4) | 填写数值:-1或者 0xFFFFFFFF。 |
| dwReserved3 | unsigned int(4) | 填写数值:0。 |
| wRoomIDLen | unsigned short(2) | 用户要进入的房间号码长度,如果是离线语音服务,请填写0。 |
| strRoomID | string | 用户要进入的房间号码字符。 |
三、密钥
腾讯云 GME 控制台获取相关权限密钥。
四、算法
TEA 对称加密算法。
总体建议,建议接入初期使用客户端部署方案,后面可优化为部署在游戏 App 后台。
| 方案 | 优点 | 缺点 |
| 后台部署 | 安全性高 | 需要后台开发联调 |
| 客户端部署 | 接入快速 | 安全性低 |
五、后台部署使用方法
后台生成加密串后,下发给客户端,客户端适用于如下场景,调用 API:EnterRoom 进行进房操作时,将加密串传给进房参数的 authBuffer 字段。
六、算法加密详情
·密钥:APPID 对应的鉴权密钥
·加密算法:TEA 加密
注意:控制台修改密钥后,15分钟 – 1小时内生效,不建议频繁更换。
七、加密方法
1. 把明文中的数字转换成网络字节序。
2. 把明文按顺序(明文字段声明的顺序)拼接成一个字符串。
3. 用 TEA 加密拼接后的字符串,symmetry_encrypt 函数输出的字符串即为权限加密串。
注意:不需要把二进制串转成十六进制。
八、示例代码
以 C++ 语言为例,鉴权密钥示例代码如下:
unsigned char pInBuf[512]={0}; xel::byte_writer bw(pInBuf, sizeof(pInBuf)); char cVer = 1; unsigned short wOpenIDLen = (unsigned short)strlen((const char *)strOpenID); if (wOpenIDLen > 127) wOpenIDLen = 127; unsigned short wRoomIDLen = (unsigned short)strlen((const char *)strRoomID); if (wRoomIDLen > 127) wRoomIDLen = 127; bw.write_byte(cVer); bw.write_int16(wOpenIDLen); bw.write_bytes(strOpenID, wOpenIDLen); bw.write_int32(dwSdkAppId); bw.write_int32(0 /*dwRoomID*/); bw.write_int32(expTime); bw.write_int32(nAuthBits); bw.write_int32(0 /*dwAccountType*/); bw.write_int16(wRoomIDLen); bw.write_bytes(strRoomID, wRoomIDLen); int pInLen = bw.bytes_write(); unsigned char pEncryptOutBuf[512] = { 0 }; int iEncrptyLen = 0; symmetry_encrypt((const unsigned char*)pInBuf, pInLen, (const unsigned char*)key, (unsigned char*)pEncryptOutBuf, &iEncrptyLen);
我们也提供了C++、 Java 和 Go 语言的示例代码,点击下载 >>