LevelOS-Core/CPT/DatabaseHelper.cs

92 lines
4.0 KiB
C#

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
}
}