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