// 前后端加密解密一致性验证测试 const CryptoJS = require('crypto-js'); console.log('=== 前后端加密解密一致性验证测试 ===\n'); // 1. 模拟前端加密过程 const originalData = { username: 'admin', password: 'password123' }; console.log('1. 原始数据:', JSON.stringify(originalData)); // 前端加密 const secretKey = 'MyDifficultPassw'; const encrypted = CryptoJS.AES.encrypt(JSON.stringify(originalData), secretKey); const base64String = encrypted.toString(); console.log('2. 加密后数据 (Base64):', base64String); console.log('3. 数据长度:', base64String.length); // 检查是否为Salted__格式 const rawData = Buffer.from(base64String, 'base64'); const header = rawData.slice(0, 8).toString('utf8'); console.log('4. 是否为Salted__格式:', header === 'Salted__', '(实际值:', header, ')'); // 验证前端能否正确解密(用于对比) const decryptedByFrontend = CryptoJS.AES.decrypt(base64String, secretKey).toString(CryptoJS.enc.Utf8); console.log('5. 前端自解密结果:', decryptedByFrontend); console.log('6. 前端自解密是否成功:', JSON.stringify(originalData) === decryptedByFrontend); // 7. 模拟前端发送前的Base64URL转换 const base64UrlString = base64String.replace(/\+/g, '-').replace(/\//g, '_'); console.log('7. Base64URL格式:', base64UrlString); // 8. 模拟后端接收和处理过程 console.log('\n=== 模拟后端处理 ==='); // 后端接收Base64URL格式数据并转换回标准Base64 const receivedString = base64UrlString; const standardBase64 = receivedString.replace(/-/g, '+').replace(/_/g, '/'); // 确保适当的填充 let paddedBase64 = standardBase64; const paddingNeeded = (4 - (standardBase64.length % 4)) % 4; for (let i = 0; i < paddingNeeded; i++) { paddedBase64 += '='; } console.log('8. 后端接收的Base64格式:', paddedBase64); // 使用Node.js模拟Java的解密过程(用于验证逻辑) // 注意:这里我们使用CryptoJS来验证,因为我们无法在Node.js中使用Java的EVP_BytesToKey // 检查数据格式 const receivedRawData = Buffer.from(paddedBase64, 'base64'); const receivedHeader = receivedRawData.slice(0, 8).toString('utf8'); console.log('9. 接收数据的头部:', receivedHeader, '(是否为Salted__):', receivedHeader === 'Salted__'); // 尝试使用CryptoJS解密(应该成功) const decryptedByCryptoJS = CryptoJS.AES.decrypt(paddedBase64, secretKey).toString(CryptoJS.enc.Utf8); console.log('10. 使用CryptoJS解密结果:', decryptedByCryptoJS); console.log('11. CryptoJS解密是否成功:', JSON.stringify(originalData) === decryptedByCryptoJS); console.log('\n=== 测试结果分析 ==='); console.log('如果第11步成功,说明加密解密逻辑在CryptoJS层面是正确的'); console.log('问题可能出在Java端的EVP_BytesToKey实现或数据处理上'); // 额外测试:检查加密数据的字节构成 console.log('\n=== 加密数据详细分析 ==='); const encryptedBytes = Buffer.from(paddedBase64, 'base64'); console.log('加密数据总长度:', encryptedBytes.length, '字节'); console.log('前8字节 (头部):', encryptedBytes.slice(0, 8).toString('utf8'), '-> Hex:', encryptedBytes.slice(0, 8).toString('hex')); console.log('第9-16字节 (盐值):', encryptedBytes.slice(8, 16).toString('hex')); console.log('后续数据长度:', encryptedBytes.length - 16, '字节'); // 测试不同长度的密码 console.log('\n=== 密钥长度验证 ==='); console.log('使用的密钥:', secretKey); console.log('密钥长度:', Buffer.byteLength(secretKey, 'utf8'), '字节 (应为16字节用于AES-128)');