consistency-test.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // 前后端加密解密一致性验证测试
  2. const CryptoJS = require('crypto-js');
  3. console.log('=== 前后端加密解密一致性验证测试 ===\n');
  4. // 1. 模拟前端加密过程
  5. const originalData = {
  6. username: 'admin',
  7. password: 'password123'
  8. };
  9. console.log('1. 原始数据:', JSON.stringify(originalData));
  10. // 前端加密
  11. const secretKey = 'MyDifficultPassw';
  12. const encrypted = CryptoJS.AES.encrypt(JSON.stringify(originalData), secretKey);
  13. const base64String = encrypted.toString();
  14. console.log('2. 加密后数据 (Base64):', base64String);
  15. console.log('3. 数据长度:', base64String.length);
  16. // 检查是否为Salted__格式
  17. const rawData = Buffer.from(base64String, 'base64');
  18. const header = rawData.slice(0, 8).toString('utf8');
  19. console.log('4. 是否为Salted__格式:', header === 'Salted__', '(实际值:', header, ')');
  20. // 验证前端能否正确解密(用于对比)
  21. const decryptedByFrontend = CryptoJS.AES.decrypt(base64String, secretKey).toString(CryptoJS.enc.Utf8);
  22. console.log('5. 前端自解密结果:', decryptedByFrontend);
  23. console.log('6. 前端自解密是否成功:', JSON.stringify(originalData) === decryptedByFrontend);
  24. // 7. 模拟前端发送前的Base64URL转换
  25. const base64UrlString = base64String.replace(/\+/g, '-').replace(/\//g, '_');
  26. console.log('7. Base64URL格式:', base64UrlString);
  27. // 8. 模拟后端接收和处理过程
  28. console.log('\n=== 模拟后端处理 ===');
  29. // 后端接收Base64URL格式数据并转换回标准Base64
  30. const receivedString = base64UrlString;
  31. const standardBase64 = receivedString.replace(/-/g, '+').replace(/_/g, '/');
  32. // 确保适当的填充
  33. let paddedBase64 = standardBase64;
  34. const paddingNeeded = (4 - (standardBase64.length % 4)) % 4;
  35. for (let i = 0; i < paddingNeeded; i++) {
  36. paddedBase64 += '=';
  37. }
  38. console.log('8. 后端接收的Base64格式:', paddedBase64);
  39. // 使用Node.js模拟Java的解密过程(用于验证逻辑)
  40. // 注意:这里我们使用CryptoJS来验证,因为我们无法在Node.js中使用Java的EVP_BytesToKey
  41. // 检查数据格式
  42. const receivedRawData = Buffer.from(paddedBase64, 'base64');
  43. const receivedHeader = receivedRawData.slice(0, 8).toString('utf8');
  44. console.log('9. 接收数据的头部:', receivedHeader, '(是否为Salted__):', receivedHeader === 'Salted__');
  45. // 尝试使用CryptoJS解密(应该成功)
  46. const decryptedByCryptoJS = CryptoJS.AES.decrypt(paddedBase64, secretKey).toString(CryptoJS.enc.Utf8);
  47. console.log('10. 使用CryptoJS解密结果:', decryptedByCryptoJS);
  48. console.log('11. CryptoJS解密是否成功:', JSON.stringify(originalData) === decryptedByCryptoJS);
  49. console.log('\n=== 测试结果分析 ===');
  50. console.log('如果第11步成功,说明加密解密逻辑在CryptoJS层面是正确的');
  51. console.log('问题可能出在Java端的EVP_BytesToKey实现或数据处理上');
  52. // 额外测试:检查加密数据的字节构成
  53. console.log('\n=== 加密数据详细分析 ===');
  54. const encryptedBytes = Buffer.from(paddedBase64, 'base64');
  55. console.log('加密数据总长度:', encryptedBytes.length, '字节');
  56. console.log('前8字节 (头部):', encryptedBytes.slice(0, 8).toString('utf8'),
  57. '-> Hex:', encryptedBytes.slice(0, 8).toString('hex'));
  58. console.log('第9-16字节 (盐值):', encryptedBytes.slice(8, 16).toString('hex'));
  59. console.log('后续数据长度:', encryptedBytes.length - 16, '字节');
  60. // 测试不同长度的密码
  61. console.log('\n=== 密钥长度验证 ===');
  62. console.log('使用的密钥:', secretKey);
  63. console.log('密钥长度:', Buffer.byteLength(secretKey, 'utf8'), '字节 (应为16字节用于AES-128)');