using DAL; using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Text.Json; namespace CPT { public static class DatabaseHelperCPT { // Opcional: Um "Salt" para dificultar ataques de dicionário locais private static readonly byte[] s_salt = { 12, 5, 8, 20, 31, 42 }; public static void Salvar(string caminhoArquivo) { try { // 1. Criamos um objeto anônimo com os dados que estão na sua classe 'DadosDaConexao' var dados = new { Host = DadosDaConexao.Host, Port = DadosDaConexao.Port, Banco = DadosDaConexao.Banco, Usuario = DadosDaConexao.Usuario, Senha = DadosDaConexao.Senha, Timeout = DadosDaConexao.ConnectTimeout, Encrypt = DadosDaConexao.Encrypt, Trust = DadosDaConexao.TrustServerCertificate }; // 2. Converte para JSON (texto puro temporário) string jsonPuro = JsonSerializer.Serialize(dados); byte[] bytesPuros = Encoding.UTF8.GetBytes(jsonPuro); // 3. CRIPTOGRAFIA DPAPI: Vincula os dados a ESTA máquina byte[] bytesCriptografados = ProtectedData.Protect( bytesPuros, s_salt, DataProtectionScope.LocalMachine); // 4. Salva o arquivo binário no disco File.WriteAllBytes(caminhoArquivo, bytesCriptografados); } catch (Exception ex) { throw new Exception("Erro ao salvar configurações de segurança: " + ex.Message); } }//Salvar public static string Carregar(string caminhoArquivo) { if (!File.Exists(caminhoArquivo)) return null; try { // 1. Lê e Descriptografa os bytes do disco via DPAPI byte[] bytesCriptografados = File.ReadAllBytes(caminhoArquivo); byte[] bytesPuros = ProtectedData.Unprotect(bytesCriptografados, s_salt, DataProtectionScope.LocalMachine); string jsonPuro = Encoding.UTF8.GetString(bytesPuros); // 2. Preenche a sua classe DadosDaConexao using (JsonDocument doc = JsonDocument.Parse(jsonPuro)) { var root = doc.RootElement; DadosDaConexao.Host = root.GetProperty("Host").GetString(); DadosDaConexao.Port = root.GetProperty("Port").GetInt32(); DadosDaConexao.Banco = root.GetProperty("Banco").GetString(); DadosDaConexao.Usuario = root.GetProperty("Usuario").GetString(); DadosDaConexao.Senha = root.GetProperty("Senha").GetString(); DadosDaConexao.ConnectTimeout = root.GetProperty("Timeout").GetInt32(); DadosDaConexao.Encrypt = root.GetProperty("Encrypt").GetBoolean(); DadosDaConexao.TrustServerCertificate = root.GetProperty("Trust").GetBoolean(); } // 3. Monta e retorna a String de Conexão formatada return $"Data Source={DadosDaConexao.Host},{DadosDaConexao.Port};" + $"Initial Catalog={DadosDaConexao.Banco};" + $"User ID={DadosDaConexao.Usuario};" + $"Password={DadosDaConexao.Senha};" + $"Connect Timeout={DadosDaConexao.ConnectTimeout};" + $"Encrypt={DadosDaConexao.Encrypt.ToString().ToLower()};" + $"TrustServerCertificate={DadosDaConexao.TrustServerCertificate.ToString().ToLower()};"; } catch (Exception ex) { throw new Exception("Erro ao processar configurações: " + ex.Message); } }//Carregar } }