92 lines
4.0 KiB
C#
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
|
|
}
|
|
}
|