db-sync 0.1.0

A secure and stable database backup synchronization system with automatic file transfer and verification
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use std::time::{SystemTime, UNIX_EPOCH};

/// 生成512位的安全token
fn generate_secure_token_512(system_ip: &str, system_name: &str, secret_key: &str) -> String {
    let mut token = String::new();
    
    // 生成多个哈希值来组成512位token(128个十六进制字符)
    for i in 0..8 {
        let mut hasher = DefaultHasher::new();
        
        let timestamp = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .unwrap()
            .as_nanos();
        
        // 为每个部分添加不同的盐值
        let combined = format!("{}:{}:{}:{}:{}", system_ip, system_name, secret_key, timestamp, i);
        combined.hash(&mut hasher);
        
        token.push_str(&format!("{:016x}", hasher.finish()));
    }
    
    // 确保token长度为128个十六进制字符(512位)
    token.truncate(128);
    token
}

/// 生成512位的简单token
fn generate_simple_token_512() -> String {
    let mut token = String::new();
    
    for i in 0..8 {
        let mut hasher = DefaultHasher::new();
        let timestamp = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .unwrap()
            .as_nanos();
        
        let combined = format!("{}:{}", timestamp, i);
        combined.hash(&mut hasher);
        
        token.push_str(&format!("{:016x}", hasher.finish()));
    }
    
    token.truncate(128);
    token
}

fn main() {
    println!("=== 512位Token生成工具 ===\n");
    
    // 为实际系统配置生成不同的token
    let secret_key = "db_sync_secret_key_2025"; // 在实际使用中应该是一个安全的密钥
    
    // 系统1: 新峰人力资源管理系统
    let system1_ip = "10.124.18.43";
    let system1_name = "新峰人力资源管理系统";
    let token1 = generate_secure_token_512(system1_ip, system1_name, secret_key);
    
    println!("系统1 - 新峰人力资源管理系统:");
    println!("系统IP: {}", system1_ip);
    println!("系统名称: {}", system1_name);
    println!("Token长度: {}", token1.len() * 4); // 每个十六进制字符4位
    println!("生成的Token: {}\n", token1);
    
    // 系统2: 西峰集团资产管理系统
    let system2_ip = "10.124.18.14";
    let system2_name = "西峰集团资产管理系统";
    let token2 = generate_secure_token_512(system2_ip, system2_name, secret_key);
    
    println!("系统2 - 西峰集团资产管理系统:");
    println!("系统IP: {}", system2_ip);
    println!("系统名称: {}", system2_name);
    println!("Token长度: {}", token2.len() * 4);
    println!("生成的Token: {}\n", token2);
    
    // 验证token确实不同
    println!("=== Token验证 ===");
    if token1 != token2 {
        println!("✓ 两个系统的token不相同,安全性良好");
    } else {
        println!("✗ 警告:两个系统的token相同,存在安全风险!");
    }
    
    // 生成服务端配置文件
    println!("\n=== 服务端配置文件 (server.config.json) ===");
    println!("{{
    \"listen_addr\": \"10.124.108.156:21005\",
    \"data\":[
        {{
            \"system_name\":\"新峰人力资源管理系统\",
            \"system_ip\":\"10.124.18.43\",
            \"backup_dir\": \"F:/DB_BACKUP_DIR/10.124.18.43\",
            \"auth_token\": \"{}\"
        }},
        {{
            \"system_name\":\"西峰集团资产管理系统\",
            \"system_ip\":\"10.124.18.14\",
            \"backup_dir\": \"F:/DB_BACKUP_DIR/10.124.18.14\",
            \"auth_token\": \"{}\"
        }}
    ]
}}", token1, token2);
    
    // 生成客户端配置文件
    println!("\n=== 客户端配置文件 (client.config.json) ===");
    println!("{{
    \"data\":[
        {{
            \"system_name\":\"新峰人力资源管理系统\",
            \"system_ip\":\"10.124.18.43\",
            \"backup_server_url\": \"http://10.124.108.156:21005\",
            \"auth_token\": \"{}\",
            \"local_backup_dir\": \"F:/webhr_backup/data\"
        }},
        {{
            \"system_name\":\"西峰集团资产管理系统\",
            \"system_ip\":\"10.124.18.14\",
            \"backup_server_url\": \"http://10.124.108.156:21005\",
            \"auth_token\": \"{}\",
            \"local_backup_dir\": \"F:/databack/\"
        }}
    ]
}}", token1, token2);
    
    println!("\n=== 使用说明 ===");
    println!("1. 每个系统都有独立的512位token");
    println!("2. 将对应的token复制到服务端和客户端配置文件中");
    println!("3. 确保同一系统的服务端和客户端使用相同的token");
    println!("4. 在生产环境中,应该使用更安全的密钥管理方式");
    println!("5. 可以定期更换token以提高安全性");
    
    println!("\n=== 安全建议 ===");
    println!("1. 不要在代码中硬编码密钥");
    println!("2. 使用环境变量或安全的密钥存储方案");
    println!("3. 定期轮换token(建议每3-6个月)");
    println!("4. 监控异常的认证请求");
    println!("5. 在生产环境中使用HTTPS协议");
    println!("6. 限制token的访问权限和使用范围");
}