This commit is contained in:
“xHuPo” 2025-06-09 13:35:15 +08:00
commit 2b8870a40e
51 changed files with 5845 additions and 0 deletions

127
utils/otp.test.js Normal file
View file

@ -0,0 +1,127 @@
/**
* OTP功能测试文件
* 可以在Node.js环境中运行此文件进行测试
*/
const otp = require('./otp.js');
/**
* 测试TOTP功能
*/
async function testTOTP() {
console.log('===== 测试TOTP功能 =====');
try {
// 生成随机密钥
const secret = otp.generateSecret();
console.log(`生成的密钥: ${secret}`);
// 生成TOTP
const token = await otp.generateTOTP(secret);
console.log(`当前TOTP: ${token}`);
// 验证TOTP
const isValid = await otp.verifyTOTP(token, secret);
console.log(`验证结果: ${isValid ? '通过' : '失败'}`);
// 获取剩余时间
const remaining = otp.getRemainingSeconds();
console.log(`剩余有效时间: ${remaining}`);
// 测试不同哈希算法
console.log('\n不同哈希算法测试:');
for (const algo of Object.keys(otp.HASH_ALGOS)) {
const algoToken = await otp.generateTOTP(secret, { algorithm: algo });
console.log(`${algo}: ${algoToken}`);
}
// 测试不同位数
console.log('\n不同位数测试:');
for (const digits of [6, 7, 8]) {
const digitToken = await otp.generateTOTP(secret, { digits });
console.log(`${digits}位: ${digitToken}`);
}
// 测试不同时间窗口
console.log('\n不同时间窗口测试:');
for (const period of [30, 60, 90]) {
const periodToken = await otp.generateTOTP(secret, { period });
console.log(`${period}秒: ${periodToken}`);
}
// 生成URI
const uri = otp.generateTOTPUri(secret, 'test@example.com', 'TestApp');
console.log(`\nTOTP URI: ${uri}`);
// 解析URI
const parsedUri = otp.parseOTPUri(uri);
console.log('解析URI结果:', parsedUri);
// 测试Steam令牌
const steamToken = await otp.generateSteamToken(secret);
console.log(`\nSteam令牌: ${steamToken}`);
console.log('\nTOTP测试完成');
} catch (error) {
console.error('TOTP测试失败:', error);
}
}
/**
* 测试HOTP功能
*/
async function testHOTP() {
console.log('\n===== 测试HOTP功能 =====');
try {
// 生成随机密钥
const secret = otp.generateSecret();
console.log(`生成的密钥: ${secret}`);
// 测试不同计数器值
console.log('\n不同计数器值测试:');
for (let counter = 0; counter < 5; counter++) {
const token = await otp.generateHOTP(secret, counter);
console.log(`计数器 ${counter}: ${token}`);
// 验证HOTP
const result = await otp.verifyHOTP(token, secret, counter);
console.log(`验证结果: ${result !== false ? '通过' : '失败'}`);
}
// 测试窗口验证
console.log('\n窗口验证测试:');
const token = await otp.generateHOTP(secret, 5);
for (let counter = 3; counter <= 7; counter++) {
const result = await otp.verifyHOTP(token, secret, counter, { window: 2 });
console.log(`计数器 ${counter} 验证结果: ${result !== false ? `通过,匹配计数器 ${result}` : '失败'}`);
}
// 生成URI
const uri = otp.generateHOTPUri(secret, 'test@example.com', 'TestApp', 0);
console.log(`\nHOTP URI: ${uri}`);
// 解析URI
const parsedUri = otp.parseOTPUri(uri);
console.log('解析URI结果:', parsedUri);
console.log('\nHOTP测试完成');
} catch (error) {
console.error('HOTP测试失败:', error);
}
}
/**
* 运行所有测试
*/
async function runTests() {
console.log('开始OTP功能测试...\n');
await testTOTP();
await testHOTP();
console.log('\n所有测试完成');
}
// 执行测试
runTests().catch(console.error);