File size: 1,855 Bytes
dc70e52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const readline = require('readline');

const ADMIN_FILE = path.join(__dirname, '../data/admin.json');

// 创建readline接口
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// 生成盐值
function generateSalt() {
    return crypto.randomBytes(16).toString('hex');
}

// 使用盐值哈希密码
function hashPassword(password, salt) {
    return crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
}

// 提示用户输入
function question(query) {
    return new Promise((resolve) => {
        rl.question(query, resolve);
    });
}

async function main() {
    try {
        console.log('创建管理员账户\n');

        // 获取用户输入
        const username = await question('请输入管理员用户名: ');
        const password = await question('请输入管理员密码: ');

        // 生成盐值和密码哈希
        const salt = generateSalt();
        const hash = hashPassword(password, salt);

        // 创建管理员数据
        const adminData = {
            admin: {
                username,
                salt,
                hash
            }
        };

        // 确保data目录存在
        const dataDir = path.dirname(ADMIN_FILE);
        if (!fs.existsSync(dataDir)) {
            fs.mkdirSync(dataDir, { recursive: true });
        }

        // 写入文件
        fs.writeFileSync(ADMIN_FILE, JSON.stringify(adminData, null, 2));

        console.log('\n管理员账户创建成功!');
        console.log('请妥善保管账户信息,不要将admin.json文件提交到版本控制系统。');

    } catch (error) {
        console.error('创建管理员账户失败:', error);
    } finally {
        rl.close();
    }
}

main();