test-full-flow.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // 模拟前端加密登录的完整流程
  2. const CryptoJS = require('crypto-js');
  3. // 1. 前端准备登录凭据
  4. const credentials = {
  5. username: 'admin',
  6. password: 'password123'
  7. };
  8. console.log('=== 前端加密流程 ===');
  9. console.log('原始登录凭据:', JSON.stringify(credentials));
  10. // 2. 前端加密凭据
  11. const plainText = JSON.stringify(credentials);
  12. const secretKey = 'MyDifficultPassw';
  13. const encrypted = CryptoJS.AES.encrypt(plainText, secretKey);
  14. const base64String = encrypted.toString();
  15. console.log('加密后完整字符串:', base64String);
  16. console.log('加密后字符串长度:', base64String.length);
  17. // 3. 转换为Base64URL格式(后端期望的格式)
  18. let base64UrlString = base64String.replace(/\+/g, '-').replace(/\//g, '_');
  19. console.log('Base64URL格式字符串:', base64UrlString);
  20. // 4. 准备发送给后端的请求体
  21. const timestamp = Date.now();
  22. const encryptedRequest = {
  23. encryptedCredentials: base64UrlString,
  24. timestamp: timestamp
  25. };
  26. console.log('发送给后端的请求:', JSON.stringify(encryptedRequest, null, 2));
  27. console.log('\n=== 模拟后端处理流程 ===');
  28. console.log('后端接收到的请求:', JSON.stringify(encryptedRequest, null, 2));
  29. // 5. 后端处理流程
  30. try {
  31. // 后端验证时间戳(5分钟内有效)
  32. const currentTime = Date.now();
  33. const timeDiff = Math.abs(currentTime - encryptedRequest.timestamp);
  34. console.log(`时间戳验证: 请求时间=${encryptedRequest.timestamp}, 当前时间=${currentTime}, 差值=${timeDiff}ms`);
  35. if (timeDiff > 300000) { // 5分钟 = 300000毫秒
  36. console.log('时间戳验证失败');
  37. process.exit(1);
  38. }
  39. console.log('时间戳验证通过');
  40. // 后端接收到Base64URL格式并转换回标准格式
  41. const receivedString = encryptedRequest.encryptedCredentials;
  42. console.log('后端接收到的加密字符串:', receivedString);
  43. // 后端转换回标准Base64格式
  44. const standardBase64 = receivedString.replace(/-/g, '+').replace(/_/g, '/');
  45. console.log('转换回标准Base64格式:', standardBase64);
  46. // 后端确保适当的填充
  47. let paddedBase64 = standardBase64;
  48. const paddingNeeded = (4 - (standardBase64.length % 4)) % 4;
  49. for (let i = 0; i < paddingNeeded; i++) {
  50. paddedBase64 += '=';
  51. }
  52. console.log('填充后的Base64格式:', paddedBase64);
  53. // 后端解密
  54. const decryptedBytes = CryptoJS.AES.decrypt(paddedBase64, secretKey);
  55. const decryptedData = decryptedBytes.toString(CryptoJS.enc.Utf8);
  56. console.log('后端解密结果:', decryptedData);
  57. // 验证解密是否成功
  58. if (decryptedData === JSON.stringify(credentials)) {
  59. console.log('✅ 加密解密流程测试通过!');
  60. } else {
  61. console.log('❌ 加密解密流程测试失败!');
  62. console.log('期望:', JSON.stringify(credentials));
  63. console.log('实际:', decryptedData);
  64. }
  65. // 模拟将解密后的JSON解析为LoginRequest对象
  66. try {
  67. const parsedCredentials = JSON.parse(decryptedData);
  68. console.log('✅ 解析登录凭据成功:', JSON.stringify(parsedCredentials));
  69. } catch (parseError) {
  70. console.log('❌ 解析登录凭据失败:', parseError.message);
  71. }
  72. } catch (error) {
  73. console.log('❌ 后端处理流程出错:', error.message);
  74. console.error(error.stack);
  75. }