Jump to content
Fórum Script Brasil
  • 0

Qual A Forma Mais Segura?


Cesar Accardi
 Share

Question

Olá,

eu estou desenvolvendo um sistema cliente/servidor utilizando o Delphi 6 com Firebird 2.0 e gostaria de saber qual é a melhor forma de proteger os dados enviados pelos clientes, são documentos sigilosos e eu preciso impedir que esses dados possam ser visualizados ou alterados por terceiros.

Qual a melhor forma de fazer isso? Qual mecanismo (criptografia, assinatura digital, ...) mais adequado pra isso e como implementar em Delphi?

Espero que alguém possa me ajudar.

Agradeço desde já!

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0
Guest --Jonas --

O único método disponível que oferece proteção tanto no armazenamento, quanto no transporte de informações por uma rede pública ou pela Internet, é a criptografia.

A criptografia é tão antiga quanto a própria escrita. Foi depois da segunda Guerra Mundial, que ela começou a crescer e hoje em dia é largamente usada. A criptografia, formou a base para a computação moderna.

Quando se fala sobre criptografia, fala-se também sobre chaves, pois elas, são quem fecham e abrem a criptografia dos dados, existem dois métodos para se trabalhar com chaves criptográficas, eles são:

Criptografia de chaves simétricas.

Esse método, conhecido também como criptografia tradicional, funciona bem em aplicações limitadas, onde o remetente e o destinatário se preparam antecipadamente para o uso da chave.

Para que esse método funcione, todas as pessoas envolvidas devem conhecer a chave, pois quando uma mensagem criptografada chega à caixa de entrada, ela só pode ser aberta por quem possui a chave.

Esse método não é muito eficiente em conexões inseguras, no entanto, quando é utilizado sobre conexões seguras, a criptografia simétrica se torna bem eficiente.

Existem vários algoritmos de chaves simétricas, entre elas estão as seguintes:

DES (Data Encryption Standard). O DES utiliza uma chave de 56 bits e opera em blocos de 64 bits. Foi projetado inicialmente para ser utilizado em componentes de hardware, nos dias atuais, ele é usado na Internet em conexões Web segura, pois o SSL se utiliza do DES. Ele é um algoritmo seguro para a maioria das aplicações, entretanto, em aplicações altamente secretas, ele não deve ser usado, pois existe o perigo de violação.

RC2 e RC4. Mais rápidos do que o DES, esses códigos podem se tornar mais seguros com o simples aumento do tamanho das chaves, O RC2 pode substituir perfeitamente o DES com a vantagem de ser 2 vezes mais rápido, já o RC4 fica 10 vezes mais rápido.

IDEA (International Data Encryption Algorithm). Criado em 1991. Ele foi projetado para ser facilmente programado, é forte e resistente a muitas formas de criptoanálise.

Conclusão, como vantagens temos, o fato de ser facilmente implementado em hardware além da rapidez, e como desvantagem o fato de que as chaves são iguais, é de difícil distribuição, além de não aceitar a assinatura digital.

Criptografia de chaves assimétricas

A criptografia de chave pública ou criptografia assimétrica, foi criada em 1970. Esse método funciona com uma chave para criptografar, e outra para descriptografar a mesma mensagem.

No sistema de chave pública, cada pessoa tem que ter duas chaves, uma que fica publicamente disponível, e outra, que deve ser mantida em segredo.

O algoritmo que se mantém até hoje é o RSA, que é patenteado pela RSADSI (RSA Data Security Incorporated) nos Estados Unidos.

As pessoas (A) e ©, escrevem mensagens, utilizando a chave pública da pessoa (B), note que, a partir desse momento somente ela, poderá ler as mensagens

As mensagens são enviadas a pessoa (B) através da Internet;

A pessoa (B), recebe as mensagens de (A) e ©, na qual ela usa a chave privada para descriptografar;

A pessoa (B), lê as mensagens, e se tiver que responde-las, deverá usar as chaves públicas de criptografia de (A) e ou ©.

Nesse momento, é importante enfatizar que o sigilo da chave privada é muito importante, pois, a criptografia assimétrica, se baseia no fato de que a chave privada, é realmente privada, por isso, somente seu detentor deve ter acesso.

Assinatura digital:

Se a chave privada for usada para escrita, o sentido das chaves acaba sendo outro, pois, todos que tem a chave pública vão conseguir ler essa mensagem, entretanto, somente quem tem a chave privada vai conseguir escrever, logo, a mensagem deixa de ser secreta, e se torna uma mensagem autêntica, a isso, chamamos de mensagem com Assinatura Digital.

Assinatura digital + Criptografia assimétrica:

Nesse método, temos certeza de que a pessoa que nos enviou a mensagem é realmente ela, pois, usamos sua chave pública para abrir a mensagem, entretanto, precisamos da nossa chave privada, para abrir o texto que está dentro da mensagem, sendo assim, obtivemos um nível de proteção excelente.

Conclusão, como vantagens temos, utilização de chaves distintas, integridade, fácil distribuição e a assinatura digital, e como desvantagem a lentidão. Um sistema híbrido é utilizado para extrair os benefícios dos dois tipos de criptografia, onde uma chave simétrica é gerada e a mensagem é criptografada usando o Triple DES, por exemplo. Depois, a criptografia assimétrica é utilizada normalmente, mas para criptografar a chave simétrica. Assim, ganha-se a agilidade do método simétrico com a segurança do método assimétrico.

Texto de Luiz Carlos dos Santos.

Link to comment
Share on other sites

  • 0
Olá,

eu estou desenvolvendo um sistema cliente/servidor utilizando o Delphi 6 com Firebird 2.0 e gostaria de saber qual é a melhor forma de proteger os dados enviados pelos clientes, são documentos sigilosos e eu preciso impedir que esses dados possam ser visualizados ou alterados por terceiros.

Qual a melhor forma de fazer isso? Qual mecanismo (criptografia, assinatura digital, ...) mais adequado pra isso e como implementar em Delphi?

Cesar, dê uma olhada neste documento - Acesso Firebird via Internet - acho que ele pode lhe ajudar.

Link to comment
Share on other sites

  • 0

Obrigado Jonas, achei interessante o método que utiliza a Assinatura Digital + Criptografia Assimétrica. Decidi por criar meu próprio sistema de encriptação de dados.

O desafio agora é como implementar no Delphi? Qual algoritmo utilizar? Qual o nível de segurança?

Obrigado Micheus,

Este ZeBeDee parece resolver o problema da segurança nas transmissões de chaves da criptografia simétrica. Eu espero que isto me ajude na criação do meu sistema de criptografia de dados.

Link to comment
Share on other sites

  • 0

Opa

Se você encontrar algo melhor que isto eu corto meu saco fora ahuahua

http://sourceforge.net/projects/tplockbox/

Tem exemplos, usa todo tipo de criptografia desde ECB, CBC e vários métodos

Blowfish, RSA, MD5, SHA-1, DES, triple- DES, Rijndael...

De tudo que já li na net a respeito de criptografia, o melhor método é o Rijndael

cara é fantástico perde um dia ai testando os demos e vendo como funciona que

você aprende e escolhe o que é melhor pra voce...

Mais sobre Rijndael (em inglês)

Atualmente aqui na empresa utilizamos uma DLL que fiz para encriptação, uso o

método Rijndael com 256 bits

segue o fonte da DLL mass precisa do componente que passei instalado ou ao menos

suas units em uma pasta que esteja em sua type library...

(*
01/04/2005 - crp.dll
Carlos Ed. Basso
*)
library crp;

uses
  Windows,
  SysUtils,
  LbCipher,
  LbString;

{$R *.res}

(*
  ECB = Eletronic Code Book
  CBC = Cipher Blocking Chaining
*)

//Rijndael
function RDLEncrypt(lpData, lpKey, lpBuffer: PChar; var nBuffSize: Integer): BOOL; StdCall;
var
  szBuff: String;
  Key256: TKey256;
begin
  try
    GenerateLMDKey(Key256, SizeOf(Key256), StrPas(lpKey));
    szBuff := RDLEncryptStringCBCEx(StrPas(lpData), Key256, 16, True);
  except
    Result := False;
    Exit;
  end;
  if (lpBuffer = nil) or (nBuffSize <= Length(szBuff)) then
  nBuffSize := Length(szBuff) + 1 else
  StrLCopy(lpBuffer, PChar(szBuff), nBuffSize - 1);
  Result := True;
end;

function RDLDecrypt(lpData, lpKey, lpBuffer: PChar; var nBuffSize: Integer): BOOL; StdCall;
var
  szBuff: String;
  Key256: TKey256;
begin
  try
    GenerateLMDKey(Key256, SizeOf(Key256), StrPas(lpKey));
    szBuff := RDLEncryptStringCBCEx(StrPas(lpData), Key256, 16, False);
  except
    Result := False;
    Exit;
  end;
  if (lpBuffer = nil) or (nBuffSize <= Length(szBuff)) then
  nBuffSize := Length(szBuff) + 1 else
  StrLCopy(lpBuffer, PChar(szBuff), nBuffSize - 1);
  Result := True;
end;

exports
  RDLEncrypt name 'RDLEncrypt',
  RDLDecrypt name 'RDLDecrypt';

end.
e pra usar, eu carrego a DLL em tempo de execução pois pouco uso estas funções
(* CRP.DLL *)

Function RDLEncrypt(const szData, szKey: String): String;
type
  TRDLEncryptFunc = function (lpData, lpKey, lpBuffer: PChar;
    var nBuffSize: Integer): BOOL; StdCall;
var
  iLen: Integer;
  hHandle: THandle;
  RDLEncryptFunc: TRDLEncryptFunc;
begin
  hHandle := LoadLibrary(PChar(GetWindowsDir + DEFAULT_PATH + 'crp.dll'));
  if (hHandle <> 0) then
  begin
    @RDLEncryptFunc := GetProcAddress(hHandle, 'RDLEncrypt');
    if Assigned(RDLEncryptFunc) then
    begin
      RDLEncryptFunc(PChar(szData), PChar(szKey), nil, iLen);
      if iLen > 0 then
      SetLength(Result, iLen - 1);
      RDLEncryptFunc(PChar(szData), PChar(szKey), PChar(Result), iLen);
    end;
    Result := PChar(Result);
    FreeLibrary(hHandle);
  end;
end;

Function RDLDecrypt(const szData, szKey: String): String;
type
  TRDLDecryptFunc = function (lpData, lpKey, lpBuffer: PChar;
    var nBuffSize: Integer): BOOL; StdCall;
var
  iLen: Integer;
  hHandle: THandle;
  RDLDecryptFunc: TRDLDecryptFunc;
begin
  hHandle := LoadLibrary(PChar(GetWindowsDir + DEFAULT_PATH + 'crp.dll'));
  if (hHandle <> 0) then
  begin
    @RDLDecryptFunc := GetProcAddress(hHandle, 'RDLDecrypt');
    if Assigned(RDLDecryptFunc) then
    begin
      RDLDecryptFunc(PChar(szData), PChar(szKey), nil, iLen);
      if iLen > 0 then
      SetLength(Result, iLen - 1);
      RDLDecryptFunc(PChar(szData), PChar(szKey), PChar(Result), iLen);
    end;
    Result := PChar(Result);
    FreeLibrary(hHandle);
  end;
end;

Exemplo de uso

var

s: String;

begin

s := RDLEncrypt('Aqui o que você quer encriptar...', 'Chave');

ShowMessage(RDLDecrypt(s, 'Chave'));

Lembrando que em Chave você deve especificar algo que somente com essa tal

palavra ou número ou o que você quiser seja possível desencriptar o que voce encriptou,

vamos se dizer que seja uma senha...

Eu uso PChar e BOOL porque não posso usar gerenciadores de memória pra passar String

entre DLL -> EXE pois outros aplicativos feito em C++ acessam essa DLL, mas você pode

utilizar String normalmente se for embutir no EXE ou utilizar gerenciador de memória...

Abraço

Link to comment
Share on other sites

  • 0
Se você encontrar algo melhor que isto eu corto meu saco fora ahuahua
Afirmação perigosa heim?!!! :P

Valeu a dica sobre estes componentes. Eu estava mesmo precisando algo para criptografar umas strings, mas nas poucas consultas que fiz só tinha achado para tratar aquivos.

Abraços

Link to comment
Share on other sites

  • 0
Se você encontrar algo melhor que isto eu corto meu saco fora ahuahua
Afirmação perigosa heim?!!! :P

Valeu a dica sobre estes componentes. Eu estava mesmo precisando algo para criptografar umas strings, mas nas poucas consultas que fiz só tinha achado para tratar aquivos.

Abraços

opa

IUAHE verdade foi meio perigosa maiss é que de tudo que vi na net, não tinha

achado nada tão completo e opensource...

E este ai também tem demos de como encriptar arquivos se não me engano...

abraçox

Link to comment
Share on other sites

  • 0

Legal, já defini essa parte da comunicação. Vou analisar qual o melhor algoritmo pro meu problema, enquanto isso preciso solucionar outro problema:

o sistema armazena alguns dados na máquina dos usuários, e eu queria saber se alguém conhece e pode me indicar maneiras de armazenar esses dados de forma transparente para o usuário. O que eu quero dizer é o seguinte: manter a segurança dos dados na máquina do usuário para impedir que ele altere o valor de uma variável, por exemplo, ou dificultar a localização desses valores. Espero ter sido claro.

Desde já agradeço!

abraço

Link to comment
Share on other sites

  • 0
Legal, já defini essa parte da comunicação. Vou analisar qual o melhor algoritmo pro meu problema, enquanto isso preciso solucionar outro problema:

o sistema armazena alguns dados na máquina dos usuários, e eu queria saber se alguém conhece e pode me indicar maneiras de armazenar esses dados de forma transparente para o usuário. O que eu quero dizer é o seguinte: manter a segurança dos dados na máquina do usuário para impedir que ele altere o valor de uma variável, por exemplo, ou dificultar a localização desses valores. Espero ter sido claro.

Desde já agradeço!

abraço

Opa

Ueh mas não estamos falando de criptografia? rs

Então a resposta é criptografar os dados do arquivo, tem várias maneiras acredito que no TpLockBox

tem exemplos de como criptografar arquivos também deu uma olhada nos demos?

Não há melhor maneira de se guardar ou passar dados seguramente sem ser por criptografia...

abraço

Link to comment
Share on other sites

  • 0

Eu quero armazenar alguns dados na máquina do usuário, mas não quero que ele encontre a localização. Então eu pensei em utilizar a criptografia mesmo, só que com um detalhe, seria uma criptografia simétrica e nesse caso a preocupação com a segurança passa a ser no armazenamento da chave. Eu li algo sobre técnicas de esteganografia e pensei em utilizar algo do tipo, li também sobre hardlocks, exemplo: criar um método de geração da chaves que utilize informações do hardware, ou armazenar essa chave num local de difícil percepção...

Alguém tem alguma sugestão?

Valeu, abraço!

Link to comment
Share on other sites

  • 0
Guest --Jonas --
Eu quero armazenar alguns dados na máquina do usuário, mas não quero que ele encontre a localização. Então eu pensei em utilizar a criptografia mesmo, só que com um detalhe, seria uma criptografia simétrica e nesse caso a preocupação com a segurança passa a ser no armazenamento da chave. Eu li algo sobre técnicas de esteganografia e pensei em utilizar algo do tipo, li também sobre hardlocks, exemplo: criar um método de geração da chaves que utilize informações do hardware, ou armazenar essa chave num local de difícil percepção...

Alguém tem alguma sugestão?

Valeu, abraço!

Amigo, ai vai uma sugestão bem interessante:

http://publique.rdc.puc-rio.br/rdc/cgi/cgi...tpl=printerview

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...