Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulinho Cé

Criptografia Delphi e PHP

Recommended Posts

Bom dia,

Estou desenvolvendo uma aplicação em Delphi utilizando o Zeos, com banco remoto que terá acesso tambem pelo browser via php.

Pesquisei longamente no fórum, na web e não encontrei nada realmente funcional por isso venho solicitar uma ajuda dos amigos: Qual criptografia codifica e decodifica igual em Delphi e PHP? Tentei a base64 mas os resultados são muito diferentes. a MD5 não testei pois sei que ela não pode ser descriptografada e no Delphi eu quero consultar o cadastro de usuário e mostrar a senha cadastrada para o Admin, possibilitando a sua alteração.

 

Muito obrigado pelas opiniões,

 

Um abraço.

 

Paulinho cé

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em tese, bastaria escolher algum algoritimo desenvolvido em conformidade com alguma RFC. O problema é que ainda existem implementações não regulamentadas de algoritimos.

 

PHP tem vários, mas uma bem interessante é a MCrypt que aceita, dentre tantas, Rijndael 256 bits. Com certeza deve existir algo em Delphi.

 

Em você entendendo como funciona no PHP e espelhando a encriptação (Delphi) com a descriptação (PHP) ou vice-versa, deve funcionar.

 

Se não conseguir MESMO, não permita que a senha seja visualizada. Na maioria dos sistemas, o Administrador deve poder fazer de tudo, mas ver a senha do usuário, que é escolha particular dele, seria violação de privacidade, afinal, o usuário pode, por exemplo, usar a mesma senha no e-mail dele.

 

Sendo assim, permita que o Administrador altere a senha, mas não permita que ele a veja.

 

Na minha opinião, é a forma mais politicamente correta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Bruno,

 

Legal encontrar uma resposta amigável e inteligente, por isso curto muito o iMaster, muito obrigado.

Encontrei uma biblioteca DCPcrypt 2.0 adaptei os códigos para o Delphi 7 e PHP no Dreamweaver e funcionou.

A única alteração significativa foi fazer um Trim(string) nas strings Delphi para retirar os espaços em branco mas no PHP funcionou direto.

Se alguem precisar posso postar a biblioteca e um exemplo em php que garimpei na web.

 

Agora posso visualizar a senha descriptografada no Delphi e acessá-la no PHP.

Os usuários cadastrados são gerentes locais do administrador do sistema por isso creio não haver violação de privacidade nas senhas pois elas serão geradas pelo administrador.

 

Muito obrigado e um grande abraço.

 

Paulinho Cé

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode postar sim, conhecimento agregado é sempre muito bom. :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno e amigos, vou postar a forma que encontrei para solucionar o problema de criptografia e descriptografia de senha criada no Delphi e lida no php via browser.

Inicalmente façam o download da biblioteca DCPCrypt: aqui e instalem no Delphi. Na pasta docs do arquivo descompactado tem uns html que explicam como instalar, creio que todos conhecem o processo. No meu caso, nem precisei utilizar os componentes instalados mas sim um exemplo que tem no mesmo link e que pode ser baixado: phpencryption. Anteriormente eu havia tentado diversos métodos de criptografia mas todos apresentavam dificuldades: ou eram one-way ou descriptografavam diferente e consequentemente não serviam.

após a instalação da package, abram o projeto EncryptTest.dpr e vejam os códigos dos botões do form. Aí está a solução

no Delphi: Basta adequá-lo à sua necessidade. Vejam como fiz:

// CRIPTOGRAFAR

uses

DCPcrypt2, DCPrijndael, DCPbase64;

const

KeySize = 32; // 32 bytes = 256 bits

BlockSize = 16; // 16 bytes = 128 bits

 

{$R *.dfm}

function PadWithZeros(const str : string; size : integer) : string;

var

origsize, i : integer;

begin

Result := str;

origsize := Length(Result);

if ((origsize mod size) <> 0) or (origsize = 0) then

begin

SetLength(Result,((origsize div size)+1)*size);

for i := origsize+1 to Length(Result) do

Result := #0;

end;

end;

//.......

 

procedure Tfcadausuarios.Button2Click(Sender: TObject);

var

Cipher : TDCP_rijndael;

Data, Key, IV : string;

saida : string;

begin

 

Key := PadWithZeros('My key',KeySize);

IV := PadWithZeros('',BlockSize);

Data := PadWithZeros(edit2.Text,BlockSize);

Cipher := TDCP_rijndael.Create(Self);

if Length('My key') <= 16 then

Cipher.Init(Key[1],128,@IV[1])

else if Length('My key') <= 24 then

Cipher.Init(Key[1],192,@IV[1])

else

Cipher.Init(Key[1],256,@IV[1]);

Cipher.EncryptCBC(Data[1],Data[1],Length(Data));

Cipher.Free;

FillChar(Key[1],Length(Key),0);

saida := Base64EncodeStr(Data);

//.....

ztable1pass.value:= saida;

 

procedure Tfcadausuarios.DBGrid1CellClick(Column: TColumn);

var

Cipher : TDCP_rijndael;

Data, Key, IV : string;

begin

Key := PadWithZeros('My key',KeySize);// observe essa configuração pois irá ser aplicada ao PHP

IV := PadWithZeros('',BlockSize);// idem

Data := Base64DecodeStr(zquery1pass.value);

Cipher := TDCP_rijndael.Create(Self);

if Length('My key') <= 16 then

Cipher.Init(Key[1],128,@IV[1])

else if Length('My key') <= 24 then

Cipher.Init(Key[1],192,@IV[1])

else

Cipher.Init(Key[1],256,@IV[1]);

Cipher.DecryptCBC(Data[1],Data[1],Length(Data));

Cipher.Free;

FillChar(Key[1],Length(Key),0);

edit2.text := Data; //mostra descriptografada

 

DESCRIPTOGRAFAR

 

uses

DCPcrypt2, DCPrijndael, DCPbase64;

const

KeySize = 32; // 32 bytes = 256 bits

BlockSize = 16; // 16 bytes = 128 bits

{$R *.dfm}

 

function PadWithZeros(const str : string; size : integer) : string;

var

origsize, i : integer;

begin

Result := str;

origsize := Length(Result);

if ((origsize mod size) <> 0) or (origsize = 0) then

begin

SetLength(Result,((origsize div size)+1)*size);

for i := origsize+1 to Length(Result) do

Result := #0;

end;

end;

//.....

procedure Tfpermissoes.Button2Click(Sender: TObject);

var

Cipher : TDCP_rijndael;

Data, Key, IV : string;

entrada : string;

begin

zquery1.close;

zquery1.SQL.clear;

zquery1.SQL.add('select * from acessos where login = "'+ caixamista(uppercase(edit1.Text)) + '"');

zquery1.open;

Key := PadWithZeros('My key',KeySize);

IV := PadWithZeros('',BlockSize);

Data := Base64DecodeStr(zquery1pass.value);

 

Cipher := TDCP_rijndael.Create(Self);

if Length('My key') <= 16 then

Cipher.Init(Key[1],128,@IV[1])

else if Length('My key') <= 24 then

Cipher.Init(Key[1],192,@IV[1])

else

Cipher.Init(Key[1],256,@IV[1]);

Cipher.DecryptCBC(Data[1],Data[1],Length(Data));

Cipher.Free;

FillChar(Key[1],Length(Key),0);

entrada := Data;

if trim(entrada) = trim(edit2.Text) then//detalhe importante

begin

permi:=zquery1level.value; //salva permissão na variavel global

//........

 

 

O detalhe importante é que é preciso fazer um trim nas strings pois inicialmente a comparação não era verdadeira, só após retirar os espaços das strings é que funcionou. Então temos o aplicativo Delphi lendo a senha criptografada e salva no Mysql.

 

Retirei os códigos intermediários senão o post ficaria longo demais, embora pareça confuso, quando abrirem o projeto no Delphi parecerá fácil.

Abaixo o arquivo encrypttest.php adaptado à minha necessidade: comparar a senha recebida do form de login e enviar o usuário ao nível do site permitido.

$senha = $_POST['senha'];

$key = 'My key';// conforme configurado no delphi

$iv = '';// conforme configurado no Delphi

$data = $senha;

$encryptedecb = mcrypt_ecb(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_ENCRYPT,$iv);

$senha = base64_encode($encryptedecb);

 

Espero que não tenha ficado confuso demais retirando os códigos intermediários mas eles não são relevantes ao propósito. Qualquer coisa estarei à disposição para pensar junto com quem tiver a necessidade de aplicar essa solução.

Grande abraço, muito obrigado.

 

Paulinho Cé

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo,

 

Na minha resposta existe um link onde você pode acessa a pagina do David Barton onde existe a biblioteca e exemplos para download.

São códigos opensource portanto não ferem a política do fórum, eu espero.

 

Abraços,

 

Paulinho Cé

Compartilhar este post


Link para o post
Compartilhar em outros sites

São códigos opensource portanto não ferem a política do fórum, eu espero.

 

Como é opensource, então não fere a política do fórum.

 

Agradecemos por compartilhar.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.