madipo2611 00b6b32cf3
All checks were successful
continuous-integration/drone/push Build is passing
v.0.0.4 Добавлено шифрование сообщения
2025-08-20 23:29:04 +03:00

101 lines
2.6 KiB
Go

package crypto
import (
"encoding/base64"
"fmt"
"log"
"time"
"github.com/hashicorp/vault/api"
)
type VaultManager struct {
client *api.Client
}
func NewVaultManager() (*VaultManager, error) {
config := api.DefaultConfig()
config.Address = "http://192.168.0.59:8200" // или https в продакшене
client, err := api.NewClient(config)
if err != nil {
return nil, fmt.Errorf("failed to create Vault client: %v", err)
}
// Аутентификация через username/password
authData := map[string]interface{}{
"password": "2T6sDQ3PyG6x+0Z950ojAA+lWQ8HhUqd",
}
secret, err := client.Logical().Write("auth/userpass/login/tailly-app", authData)
if err != nil {
return nil, fmt.Errorf("failed to authenticate with Vault: %v", err)
}
client.SetToken(secret.Auth.ClientToken)
// Настраиваем автоматическое обновление токена
go func() {
for {
time.Sleep(30 * time.Minute)
secret, err := client.Auth().Token().RenewSelf(0)
if err != nil {
log.Printf("Failed to renew Vault token: %v", err)
} else {
client.SetToken(secret.Auth.ClientToken)
}
}
}()
return &VaultManager{client: client}, nil
}
func (v *VaultManager) GetMasterPrivateKey() ([]byte, error) {
secret, err := v.client.Logical().Read("kv/data/keys/master")
if err != nil {
return nil, fmt.Errorf("failed to read master key: %v", err)
}
if secret == nil || secret.Data == nil {
return nil, fmt.Errorf("master key not found")
}
data := secret.Data["data"].(map[string]interface{})
keyBase64 := data["private_key"].(string)
return base64.StdEncoding.DecodeString(keyBase64)
}
func (v *VaultManager) StoreSessionKey(chatID int, messageID int, encryptedKey []byte) error {
path := fmt.Sprintf("kv/data/keys/chat_%d/message_%d", chatID, messageID)
_, err := v.client.Logical().Write(path, map[string]interface{}{
"data": map[string]interface{}{
"encrypted_key": base64.StdEncoding.EncodeToString(encryptedKey),
"timestamp": time.Now().Unix(),
"chat_id": chatID,
"message_id": messageID,
},
})
return err
}
func (v *VaultManager) GetSessionKey(chatID int, messageID int) ([]byte, error) {
path := fmt.Sprintf("kv/data/keys/chat_%d/message_%d", chatID, messageID)
secret, err := v.client.Logical().Read(path)
if err != nil {
return nil, err
}
if secret == nil || secret.Data == nil {
return nil, fmt.Errorf("session key not found")
}
data := secret.Data["data"].(map[string]interface{})
keyBase64 := data["encrypted_key"].(string)
return base64.StdEncoding.DecodeString(keyBase64)
}