qm_gen_signature.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. const crypto = require('crypto');
  2. function testSignatureGeneration() {
  3. const timestamp = '1745997864484';
  4. const url = `/api/account/login?t=${timestamp}&env=&qm_csrf_backend=undefined`;
  5. const data = {
  6. account_name: "zhuoyue",
  7. password: "Wnl3ejAzOTYz",
  8. env: ""
  9. };
  10. function test(testName, signString) {
  11. const signature = crypto.createHash('sha256')
  12. .update(signString)
  13. .digest('hex');
  14. console.log(`\n${testName}:`);
  15. console.log('签名字符串:', signString);
  16. console.log('生成签名:', signature);
  17. console.log('是否匹配:', signature === '87c88d2b321fd439c756847c7348a198be6abf769a46f34dbc83d9a4fec34567');
  18. }
  19. // 方案13:使用Base64编码的数据
  20. const base64Data = Buffer.from(JSON.stringify(data)).toString('base64');
  21. const str13 = `${url}&${base64Data}&${timestamp}`;
  22. test('方案13', str13);
  23. // 方案14:URL参数分开处理
  24. const urlParams = new URLSearchParams({
  25. t: timestamp,
  26. env: '',
  27. qm_csrf_backend: 'undefined'
  28. });
  29. const path = '/api/account/login';
  30. const sortedData = Object.keys(data)
  31. .sort()
  32. .map(key => `${key}=${JSON.stringify(data[key])}`)
  33. .join('&');
  34. const str14 = `${path}?${urlParams.toString()}&${sortedData}&${timestamp}`;
  35. test('方案14', str14);
  36. // 方案15:将参数作为对象处理
  37. const allParams = {
  38. ...data,
  39. t: timestamp,
  40. env: '',
  41. qm_csrf_backend: 'undefined'
  42. };
  43. const sortedAllParams = Object.keys(allParams)
  44. .sort()
  45. .map(key => `${key}=${JSON.stringify(allParams[key])}`)
  46. .join('&');
  47. const str15 = `${path}&${sortedAllParams}`;
  48. test('方案15', str15);
  49. // 方案16:处理特殊字符
  50. const encodedSortedData = Object.keys(data)
  51. .sort()
  52. .map(key => {
  53. const value = data[key].toString()
  54. .replace(/"/g, '\\"')
  55. .replace(/'/g, "\\'");
  56. return `${key}="${value}"`;
  57. })
  58. .join('&');
  59. const str16 = `${url}&${encodedSortedData}&${timestamp}`;
  60. test('方案16', str16);
  61. // 方案17:尝试不同的时间戳位置
  62. const str17 = `${timestamp}&${url}&${sortedData}`;
  63. test('方案17', str17);
  64. // 方案18:完全扁平化所有参数
  65. const flatParams = {
  66. url: path,
  67. t: timestamp,
  68. env: '',
  69. qm_csrf_backend: 'undefined',
  70. ...data
  71. };
  72. const str18 = Object.keys(flatParams)
  73. .sort()
  74. .map(key => `${key}=${flatParams[key]}`)
  75. .join('&');
  76. test('方案18', str18);
  77. }
  78. testSignatureGeneration();