Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

Protegendo seu Sistema utilizando Criptgrafias no arquivo de Configuração

Olá leitores e colegas do Devmedi,estou eu aqui novamente para dar a minha colaboração, como prometido no artigo anterior mostramos como Acessar o Banco de Dados através de arquivos .ini: http://www.devmedia.com.br/articles/viewcomp.asp?comp=7738 Quero aqui mostrar o como proteger nossos arquivos de configuração atraves de criptografia de dados.

   Nos que desenvolvemos sistemas hoje não importando a linguagem de programação  utilizada, devemos nos preocupar com os dados da empresa, principalmente com a Segurança do Banco de Dados. Muitos como eu ainda utilizamos arquivos .ini como String de Conexao com o banco de Dados, entao decidi abordar um assunto simples porem de muita eficacia.   
 
  Então amigos vamos ao que interessa, não usarei principios sobre Conexao a banco de Dados por arquivos, pois ja existe um artigo sobre isso.
 
 
  Observação: Pessoal existem muitas outras forma de Criptografias no mercados com chaves de 128 bits, e soluções muito mais eficientes para banco de dados. Porém quero deixar bem claro que estamos querendo mostrar uma solução simples apenas para esclarecimento e conhecimento dos iniciantes.
   
 
 1 - Iniciar uma nova Aplicação no Delphi.
 
  Usaremos o banco de dados feito em Firebird porem, o metodo pode ser aplicado a  qualquer banco.
 
 Usuario : SYSDBA
 Senha : masterkey 
 
 
 
 
 2 - Criar um DataModule da aplicação, iremos chamalo de DM.
 
 
 

 
 
3 -  Implementando e Entendendo o Codigo:
 
unit Udm;
interface
uses
  SysUtils, Classes, DBXpress, DB, SqlExpr,
IniFiles; //Classe que trabalha com arquivos .INI
type
  TDm = class(TDataModule)
    Conexao: TSQLConnection;
    procedure ConexaoBeforeConnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    UserBD,             { Usuário do Banco de Dados }
    PassDB,             { Senha do Banco de Dados }
    PathBD,             { Path do Banco de Dados }
    Fundo2,             {Imagem do Fundo}
    Path,                {Path do Banco de Dados}
    PathImage,        {Path das Imagens}
    PathSkin,           {Path dos Skins}
    Usuario: String;  {Armazena o Usuario}
 
   { Funções de Encriptação e Decriptação de Dados esta na sessão Public pois se trata de procedimento publico} 
    function Encrypt(const S: String; Key: Word): String;
    function Decrypt(const S: ShortString; Key: Word): String;
  end;
var
  Dm: TDm;
implementation
{$R *.dfm}
const
 
 { Constantes que irão ser utilizadas nos cálculos das rotinas de criptografia e podendo ser alteradas conforme o gosto do leitor.} 
 
  C1 = 52845;
  C2 = 22719;
 

 {Procedimento do Evento BeforeConnect do Objeto sqlConnection onde irá ler todas as informações do arquivo Ini criptografado} 
 
procedure TDm.ConexaoBeforeConnect(Sender: TObject);
var
ConfigIni : TIniFile;
Path : String;
begin
//Seta as propriedades da conexão em tempo de execução pegando os dados do arquivo config.ini
 ConfigIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini');
 Conexao.Params.Values['Database']:= ConfigIni.ReadString('CONFIG', 'DATABASE', '');
 ConfigIni.Free;
end;
 
 {Função declarada acima encarregada de encriptar os dados, como podemos ver as Contasntes C1 e C2
estão sendo utilizadas para a execução desse bloco de comando}
function TDm.Encrypt(const S: String; Key: Word): String;
var
  I: byte;
begin
  Result := '';
  for I := 1 to Length(S) do
  begin
    Result := Result + IntToHex(byte(char(byte(S[I]) xor (Key shr 8))), 2);
    Key := (byte(char(byte(S[I]) xor (Key shr 8))) + Key) * C1 + C2;
  end;
end;
 
 {Função declarada acima encarregada de decriptar os dados}
 
function TDm.Decrypt(const S: ShortString; Key: Word): String;
var
  I: byte;
  x: char;
begin
  result := '';
  i := 1;
  while (i < Length(S)) do
  begin
    x := char(strToInt('$' + Copy(s, i, 2)));
    Result := result + char(byte(x) xor (Key shr 8));
    Key := (byte(x) + Key) * C1 + C2;
    Inc(i, 2);
  end;
end;
end.
 
 Bom já entendemos o Codigo vamos agora ao Proximo passo implementar isso nos Forms.
 
4- Criaremos outro Form e chamaremos de Principal.
 
    
 
 
{Apenas implemtaremos um comando para ler os Diretorios lá do arquivo ini e Coloca-los em Memoria nas variaveis do DataModule}
 
procedure TFrmLogin.FormCreate(Sender: TObject);
var
  Arq: TIniFile;
begin
  DecimalSeparator := ',';    
  ThousandSeparator := '.'; 
  ShortDateFormat := 'dd/mm/yyyy';
 
  Arq := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Config.ini');
  with DM do
  begin
     Path   := Arq.ReadString('CONFIG', 'DATABASE', ExtractFilePath(Application.ExeName) + 'CONFIG');
  PathImage := Arq.ReadString('IMAGEM_FUNDO','IMAGEN',PathImage);
   PathSkin := Arq.ReadString('SKIN','SKIN',PathSkin);
     UserBD := Decrypt(Arq.ReadString('DATABASE', 'Username', Encrypt('SYSDBA', 7834)), 7834);
     PassDB := Decrypt(Arq.ReadString('DATABASE', 'Password', Encrypt('masterkey', 7834)), 7834);
    
end;
end;
 
 
 Chamaremos o Proximo Form com o Comando a seguir
 
    Application.CreateForm(TFrmConfig,FrmConfig);
    FrmConfig.ShowModal;
    FrmConfig.Free;
 
5 - Ainda Criaremos outro Form para as Configurações que se chamara de FrmConfig;
 
  
 
  Aqui vem o Procedimento de Leitura:
 
{ Abertura de Diretorios }
procedure TFrmConfig.BitBtn3Click(Sender: TObject);
begin
 If OpenDialog1.Execute Then
   edtPatch.Text:= OpenDialog1.FileName;
end;
procedure TFrmConfig.BitBtn2Click(Sender: TObject);
begin
  If OpenDialog1.Execute Then
    EdtImagen.Text:= OpenDialog1.FileName;
end;
procedure TFrmConfig.BitBtn4Click(Sender: TObject);
begin
 If OpenDialog1.Execute Then
    EdtSkin.Text:= OpenDialog1.FileName;
end;
 
 { Aqui vem os comandos de Gravação e Leitura atraves dos procedimentos e das variaveis declaradas no DataModule anteriormente}
procedure TFrmConfig.btOkClick(Sender: TObject);
 Var
  Cfg,Arq: TIniFile;
 begin
 With DM do
  begin
  
 {Observe que aquelas variaveis no DataModule declaradas são recuperadas com Dados em Memoria a partir da inicialização do Form}  

   PathBD := EdtPatch.Text;      { Path do Banco de Dados }
   UserBD := edtUserDB.Text;     { Usuario do Banco de Dados }
   PassDB := edtPassDB.Text;    { Senha do Banco de Dados }
   Path:=EdtPatch.Text;           {a variavel recebeo conteudo puxado pelo edit ao solicitar o acesso a outro banco e dados}
   PathImage:=EdtImagen.Text;  { Path das imagens }
   PathSkin:=EdtSkin.Text;        { Path das Skins }
 
  {Se a conexao for Local}
   if (RadioLocal.Checked = True ) Then
            PathBD := EdtPatch.Text    { Path do Banco de Dados }
    {Senão a conexao Vai receber o Ip do Servidor, a porta de Comunicação e o Patch do banco}
    else
     PathBD := EdtIp.Text+':'+ EdtPorta.Text+':'+EdtPatch.Text  ;
                  {Ip, Porta e Path do Banco de Dados }
 
   Arq:= TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Config.ini');
   Arq.WriteString('CONFIG','DATABASE',Path);          //Grava o conteudo escrito no Edit no arquivo .ini
   Arq.WriteString('IMAGEM_FUNDO','IMAGEN',PathImage);
   Arq.WriteString('SKIN','SKIN',PathSkin);
   Arq.WriteString('DATABASE', 'Username', Encrypt(UserBD, 7834));
   Arq.WriteString('DATABASE', 'Password', Encrypt(PassDB, 7834));
   Arq.Free;
    end;
    Close;
end;
end.

 
  Observe que quando as configurações são alteradas novamente no arquivo Config.ini ja indo criptografadas como podemos ver em vermelho. Isso pode ser implementado de varias maneiras a depender de cada desenvolvedor no meu caso eu criptografo apenas o usuario e a senha, porem os demais diretorios e arquivo tbm podem ser criptografados e lidos na inicialização do Sistema..
 
 
Obrigado a Todos !!!
Seu voto e muito importante para nós!
 
Emerson Martins
Analista de Sistemas junior
email:emersonmartins8@gmail.com
 
 
 
 
 
 
 
 
 
 
 





    6 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Tathiana
Então mesmo sendo assinante não posso baixar o post?


em 19/3/2008 14:50 - Responder

 

  Devmedia
ola Tathiana, problema resolvido, thanks;


em 19/3/2008 19:00 - Responder
 

  Tathiana
Ok, obrigada !


em 20/3/2008 15:07 - Responder
 

Paulo Freire
Parabens, show de bola.


em 25/3/2008 09:06 - Responder

 

Jb
para nao precisar fazer toda essa parafernalha poderia criptografar todo o texto do arquivo e carregar os dados utilizando uma stringlist... mas como ta bem explicado merece um abraço ^_^


em 5/5/2008 16:12 - Responder

 

Denis
Estou usando o algoritimo e tive sucesso ao usar em 2 projetos, já num 3 projeto quanto tento criptografar ou descriptografar alguma coisa apresenta erro. No caso da descriptografia apresenta erro na seguinte linha Key := (byte(x) + Key) * C1 + C2; "Project .... raised exception class ERangerError with message 'Range check error'. Process stopped. Use Step or Run to continue" O estranho é que o que estou tentando descriptografar é a mesma palavra que funciona nos outros dois projetos. O que poderia ser este erro ? ? ?


em 3/6/2008 11:33 - Responder

 



[Este post ainda não foi associado a uma sequência]
Autor
Emerson Martins

Analista de Sistemas e Especialista em Banco de Dados pela FAL - Faculdade de Alagoas,Atualmente Consultor Senior de Banco de Dados do Instituto de Tecnologia do Estado de Alagoas, utilizando PostgreSQL,SQL Sever,Oracle 10 g, programa em Delphi a mais de 5 anos.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
10   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível somente para quem possui Créditos DevMedia. (Ele não está associado a nenhuma publicação DevMedia).


  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03