go实现实时双向增量文件同步加密传输系统代码

代码语言:golang

所属分类:其他

代码描述:go实现实时双向增量文件同步加密传输系统代码,客户端与服务端文件夹内文件实时保持同步,加密通讯传输。

代码标签: go 实时 双向 增量 文件 同步 加密 传输 系统 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

		
// 实时双向增量文件同步加密传输系统

// ## 使用方法

// ### 1. 安装依赖

// ```bash
// go get github.com/fsnotify/fsnotify
// ```

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/md5"
	"crypto/rand"
	"crypto/sha256"
	"encoding/binary"
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"log"
	"net"
	"os"
	"path/filepath"
	"strings"
	"sync"
	"time"

	"github.com/fsnotify/fsnotify"
)

// ============ 常量定义 ============
const (
	// 消息类型
	MsgTypeFileSync   = 1
	MsgTypeFileDelete = 2
	MsgTypeFileList   = 3
	MsgTypeHeartbeat  = 4

	// 加密密钥(实际使用中应该从配置文件或环境变量读取)
	DefaultKey = "my-32-byte-secret-key-change!!"
	BufferSize = 8192
)

// ============ 数据结构 ============

// Message 网络传输消息
type Message struct {
	Type      int       `json:"type"`
	FilePath  string    `json:"file_path"`
	FileHash  string    `json:"file_hash"`
	FileSize  int64     `json:"file_size"`
	Data      []byte    `json:"data"`
	Timestamp time.Time `json:"timestamp"`
}

// FileInfo 文件元数据
type FileInfo struct {
	Path    string    `json:"path"`
	Hash    string    `json:"hash"`
	Size    int64     `json:"size"`
	ModTime time.Time `json:"mod_time"`
}

// FileSync 文件同步器
type FileSync struct {
	syncDir     string
	conn        net.Conn
	key         []byte
	fileMap     map[string]*FileInfo
	mapMutex    sync.RWMutex
	watcher     *fsnotify.Watcher
	isServer    bool
	ignoreNext  map[string]time.Time
	ignoreMutex sync.Mutex
}

// ============ 加密/解密功能 ============

// Encrypt AES-GCM 加密
func Encrypt(data, key []byte) ([]byte, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return nil, err
	}

	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return nil, err
	}

	nonce := make([]byte, gcm.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		return nil, err
	}

	ciphertext := gcm.Seal(nonce, nonce, data, nil)
	return ciphertext, nil
}

// Decrypt AES-GCM 解密
func Decrypt(data, key []byte) ([]byte, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return nil, err
	}

	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return nil, err
	}

	nonceSize := gcm.NonceSize()
	if len(data) < nonceSize {
		return nil, fmt.Errorf("ciphertext too short")
	}

	nonce, ciphertext := data[:nonceSize], data[nonceSize:]
	plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
	if err != nil {
		return nil, err
	}

	return plaintext, nil
}

// ============ 文件操作 ============

// CalculateFileHash 计算文件哈希
func CalculateFileHash(filePath string) (string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer file.Close()

	hash := md5.New()
	if _, err := io.Copy(hash, file); err != nil {
		return "", err
	}

	return fmt.Sprintf("%x", has.........完整代码请登录后点击上方下载按钮下载查看

网友评论0