| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // 前后端加密解密一致性验证测试
- 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)');
|