O LinuxCrypt é um componente que utiliza o algoritmo de criptografia de senhas
do Linux, gerando um hash de 34 bytes que é impossível (??) de decriptografar!
Bom... Então, como o linux verifica a senha do usuário? Fácil!! Basta
criptografar a senha informada por ele e comparar o hash resultante com a senha
armazenada no banco de dados!
Para ilustrar, veja um exemplo:
-> É definida uma senha para um usuário através dos seguinte comandos:
LinuxCrypt.GenerateSalt := True; // Essa instrução evita a necessidade de
passarmos o Salt (8 caracteres aleatórios) manualmente para a o método
MD5Crypt(Senha, Salt).
senha_usuario := LinuxCrypt.MD5Crypt('senha', ''); // A senha informada
pelo usuário foi 'senha', mas poderia ser PChar(Edit1.Text), por exemplo.
Repare que o typecast PChar() torna-se necessário quando usamos Edit's!
Dependendo do valor de Salt, a senha criptografada (hash) será algo parecido
com '$1$m8IlinIx$DUTJQVtvda2Yy2CpFfcux1'. Esse valor será atribuído à
variável senha_usuario. Repare os 8 caracteres entre o segundo $ e o
último $, 'm8IlinIx'. Esse foi o Salt gerado automaticamente pelo
componente e deverá ser usado no momento de verificação de senhas.
-> Verificando se a senha digitada confere:
LinuxCrypt.GenerateSalt := False; // Precisaremos passar o Salt manualmente
(m8IlinIx) para a função MD5Crypt, para verificar se o hash retornado
confere com o armazenado.
if LinuxCrypt.MD5Crypt(senha_informada_pelo_usuario, Copy(senha_usuario, 4, 8))
= senha_usuario then ... // Nesse instante estamos passando a string da variavel
senha_informada_pelo_usuario, juntamente com o salt gerado anteriormente
(Copy(senha_usuario, 4, 8), que é igual à m8IlinIx) e verificando se o valor do
retorno é igual à senha criptografada anteriormente
('$1$m8IlinIx$DUTJQVtvda2Yy2CpFfcux1').
Se o usuário informou 'senha', o retorno será exatamente o hash gerado
anteriormente e assim, podemos verificar que as senhas são iguais.
Esse é exatamente o procedimento que o Linux utiliza quando vc entra com o usuário
e senha na tela de login. A senha não pode ser descriptografada, mas nada impede
que criptografamos algo digitado pelo usuário e comparamos com o hash armazenado
no banco de dados!!
Boas Criptografias!!
Bruno Freitas