Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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é
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é
Pode postar sim, conhecimento agregado é sempre muito bom. :thumbsup:
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é
Onde você conseguiu as UNITS DCPcrypt2, DCPrijndael, DCPbase64, me parece que as mesmas não são nativas ao delphi...
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é
>
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.
;)
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.