GenerateTestUserSig.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Module: GenerateTestUserSig
  3. *
  4. * Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。
  5. * 其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
  6. *
  7. * Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
  8. *
  9. * 本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,
  10. * 这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
  11. * 一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
  12. *
  13. * 正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
  14. * 由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。
  15. *
  16. * Reference:https://cloud.tencent.com/document/product/647/17275#Server
  17. */
  18. import 'dart:convert';
  19. import 'dart:io';
  20. import 'package:crypto/crypto.dart';
  21. class GenerateTestUserSig {
  22. /*
  23. * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
  24. *
  25. * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/trtc ) 创建应用,即可看到 SDKAppId,
  26. * 它是腾讯云用于区分客户的唯一标识。
  27. */
  28. static int sdkAppId = 0;
  29. /*
  30. * 签名过期时间,建议不要设置的过短
  31. * <p>
  32. * 时间单位:秒
  33. * 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
  34. */
  35. static int expireTime = 604800;
  36. /*
  37. * 计算签名用的加密密钥,获取步骤如下:
  38. *
  39. * step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/trtc ),如果还没有应用就创建一个,
  40. * step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
  41. * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
  42. *
  43. * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
  44. * 文档:https://cloud.tencent.com/document/product/647/17275#Server
  45. */
  46. static String secretKey = '';
  47. ///生成UserSig
  48. static genTestSig(String userId) {
  49. int currTime = _getCurrentTime();
  50. String sig = '';
  51. Map<String, dynamic> sigDoc = new Map<String, dynamic>();
  52. sigDoc.addAll({
  53. "TLS.ver": "2.0",
  54. "TLS.identifier": userId,
  55. "TLS.sdkappid": sdkAppId,
  56. "TLS.expire": expireTime,
  57. "TLS.time": currTime,
  58. });
  59. sig = _hmacsha256(
  60. identifier: userId,
  61. currTime: currTime,
  62. expire: expireTime,
  63. );
  64. sigDoc['TLS.sig'] = sig;
  65. String jsonStr = json.encode(sigDoc);
  66. List<int> compress = zlib.encode(utf8.encode(jsonStr));
  67. return _escape(content: base64.encode(compress));
  68. }
  69. static int _getCurrentTime() {
  70. return (new DateTime.now().millisecondsSinceEpoch / 1000).floor();
  71. }
  72. static String _hmacsha256({
  73. required String identifier,
  74. required int currTime,
  75. required int expire,
  76. }) {
  77. int sdkappid = sdkAppId;
  78. String contentToBeSigned =
  79. "TLS.identifier:$identifier\nTLS.sdkappid:$sdkappid\nTLS.time:$currTime\nTLS.expire:$expire\n";
  80. Hmac hmacSha256 = new Hmac(sha256, utf8.encode(secretKey));
  81. Digest hmacSha256Digest =
  82. hmacSha256.convert(utf8.encode(contentToBeSigned));
  83. return base64.encode(hmacSha256Digest.bytes);
  84. }
  85. static String _escape({
  86. required String content,
  87. }) {
  88. return content
  89. .replaceAll('\+', '*')
  90. .replaceAll('\/', '-')
  91. .replaceAll('=', '_');
  92. }
  93. }