Criptografar/Descriptografar senha
Pessoal,
Estou utilizando o banco de usuários de uma outra aplicação porém a senha é criptografada. Arrumei a função que criptografa/descriptografa a senha mas estou tendo problemas ao tentar descriptografar a senha para dar acesso ao meu sistema.
Será que alguém poderia me ajudar? Onde tenho que passar a senha para descriptografar e depois passar a senha para validação no banco??? Já tentei de várias formas e não consegui.
Tenho o seguinte:
************************************************************
ROTINA PARA CRIPTOGRAFAR/DESCRIPTOGRAFAR SENHA
Function TUtil.CRIPTO_SENHA(pTexto: string; const SENHA: string): string;
{ Criptografa a Senha}
var
vCompr_Texto, vCompr_Senha: integer;
vCont_Texto, vCont_Senha: integer;
vInt_Texto, vInt_Senha, vInt_Result : integer;
vResultado: string;
vLetra : char;
i: integer;
begin
{Inicializando as variáveis}
vCompr_Texto := Length(pTexto);
vCompr_Senha := Length(SENHA);
vCont_Senha := 1;
vResultado := ´´;
{Criptografando ou Decriptografando}
for vCont_Texto := 1 to vCompr_Texto do
begin
vInt_Texto := Ord(pTexto[vCont_Texto]);
i:=vCont_Texto;
if i>vCompr_Senha then i:=vCompr_Senha;
vInt_Senha := Ord(SENHA[i]);
vInt_Result := vInt_Texto XOR vInt_Senha;
vLetra := Chr(vInt_Result);
vResultado := vResultado + vLetra;
vCont_Senha := vCont_Senha + 1;
if (vCont_Senha > vCompr_Senha) then
begin
vCont_Senha := 1;
end;
end;
{Retornando um valor}
CRIPTO_SENHA := vResultado;
end;
************************************************************
TENHO QUE PASSAR AGORA PARA ESSAS ROTINAS A SENHA
function TFrmPrincipal.fVerificaSenha(pUsuario, pSenha: String ) : boolean;
var
sqlStr: String;
begin
sqlStr := ´´;
fVerificaSenha := false;
if ( ( pUsuario = ´´ ) or ( pSenha = ´´ ) ) then
exit;
sqlStr := sqlStr + ´select * from USUARIO where USUARIO_SENHA = ´;
sqlStr := sqlStr + #39 + pSenha + 39;
// Consulta tabela de usuarios
DMSAV.qryAux.Close;
DMSAV.qryAux.SQL.Clear;
DMSAV.qryAux.SQL.Add( sqlStr );
DMSAV.qryAux.Open;
// Se achou
if ( not DMSAV.qryAux.Eof ) then
fVerificaSenha := true
else
fVerificaSenha := false;
end;
-------------------------------------------------------------------------
procedure TFrmPrincipal.edtSenhaChange(Sender: TObject);
var
i: integer;
begin
if (( EditNomeUsuario.Text = ´´ ) or
( edtSenha.Text = ´´ )) then
exit;
if ( fVerificaSenha( EditNomeUsuario.Text, edtSenha.Text ) ) then
begin
imgSinalVerde.Visible := true;
panSenha.Repaint;
Sleep( 500 );
pAcessaSistema( EditNomeUsuario.Text );
end;
---------[color=blue:b0601b1572]
:arrow: Título editado pelo moderador Nildo.
:arrow: Não utilize caixa alta nos títulos.[/color:b0601b1572]
:idea: [color=red:b0601b1572]Leia as regras de conduta [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689]aqui[/url][/color:b0601b1572]
Estou utilizando o banco de usuários de uma outra aplicação porém a senha é criptografada. Arrumei a função que criptografa/descriptografa a senha mas estou tendo problemas ao tentar descriptografar a senha para dar acesso ao meu sistema.
Será que alguém poderia me ajudar? Onde tenho que passar a senha para descriptografar e depois passar a senha para validação no banco??? Já tentei de várias formas e não consegui.
Tenho o seguinte:
************************************************************
ROTINA PARA CRIPTOGRAFAR/DESCRIPTOGRAFAR SENHA
Function TUtil.CRIPTO_SENHA(pTexto: string; const SENHA: string): string;
{ Criptografa a Senha}
var
vCompr_Texto, vCompr_Senha: integer;
vCont_Texto, vCont_Senha: integer;
vInt_Texto, vInt_Senha, vInt_Result : integer;
vResultado: string;
vLetra : char;
i: integer;
begin
{Inicializando as variáveis}
vCompr_Texto := Length(pTexto);
vCompr_Senha := Length(SENHA);
vCont_Senha := 1;
vResultado := ´´;
{Criptografando ou Decriptografando}
for vCont_Texto := 1 to vCompr_Texto do
begin
vInt_Texto := Ord(pTexto[vCont_Texto]);
i:=vCont_Texto;
if i>vCompr_Senha then i:=vCompr_Senha;
vInt_Senha := Ord(SENHA[i]);
vInt_Result := vInt_Texto XOR vInt_Senha;
vLetra := Chr(vInt_Result);
vResultado := vResultado + vLetra;
vCont_Senha := vCont_Senha + 1;
if (vCont_Senha > vCompr_Senha) then
begin
vCont_Senha := 1;
end;
end;
{Retornando um valor}
CRIPTO_SENHA := vResultado;
end;
************************************************************
TENHO QUE PASSAR AGORA PARA ESSAS ROTINAS A SENHA
function TFrmPrincipal.fVerificaSenha(pUsuario, pSenha: String ) : boolean;
var
sqlStr: String;
begin
sqlStr := ´´;
fVerificaSenha := false;
if ( ( pUsuario = ´´ ) or ( pSenha = ´´ ) ) then
exit;
sqlStr := sqlStr + ´select * from USUARIO where USUARIO_SENHA = ´;
sqlStr := sqlStr + #39 + pSenha + 39;
// Consulta tabela de usuarios
DMSAV.qryAux.Close;
DMSAV.qryAux.SQL.Clear;
DMSAV.qryAux.SQL.Add( sqlStr );
DMSAV.qryAux.Open;
// Se achou
if ( not DMSAV.qryAux.Eof ) then
fVerificaSenha := true
else
fVerificaSenha := false;
end;
-------------------------------------------------------------------------
procedure TFrmPrincipal.edtSenhaChange(Sender: TObject);
var
i: integer;
begin
if (( EditNomeUsuario.Text = ´´ ) or
( edtSenha.Text = ´´ )) then
exit;
if ( fVerificaSenha( EditNomeUsuario.Text, edtSenha.Text ) ) then
begin
imgSinalVerde.Visible := true;
panSenha.Repaint;
Sleep( 500 );
pAcessaSistema( EditNomeUsuario.Text );
end;
---------[color=blue:b0601b1572]
:arrow: Título editado pelo moderador Nildo.
:arrow: Não utilize caixa alta nos títulos.[/color:b0601b1572]
:idea: [color=red:b0601b1572]Leia as regras de conduta [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689]aqui[/url][/color:b0601b1572]
Barbara.michele
Curtidas 0
Respostas
Ehvasc
11/10/2004
Cara Colega,
Se eu entendi direito seu problema segue uma sugestão....
Por que a necessidade de Descriptografar a senha? Um método mais seguro, é vc compara as criptografias. O que eu estou tentando dizer é que é muito mais seguro vc criptografar a senha que o usuário digitou e comparar esse valor (criptografado) com a senha criptografada que vc tem no seu Banco de Dados. Isso evita que senha seja interceptadas num trafego de rede.
Espero ter ajudado. Boa sorte
Se eu entendi direito seu problema segue uma sugestão....
Por que a necessidade de Descriptografar a senha? Um método mais seguro, é vc compara as criptografias. O que eu estou tentando dizer é que é muito mais seguro vc criptografar a senha que o usuário digitou e comparar esse valor (criptografado) com a senha criptografada que vc tem no seu Banco de Dados. Isso evita que senha seja interceptadas num trafego de rede.
Espero ter ajudado. Boa sorte
GOSTEI 0
Barbara.michele
11/10/2004
Como então com esse código poderia fazer isso?
Obrigada
Obrigada
GOSTEI 0
Programalista
11/10/2004
Olá Barbara, esta é a rotina que uso para comparar a senha criptografado do usuário, com a senha criptografa no banco.
Esta é a solução que eu uso. Para mim funciona perfeitamente. Espero ter ajudado.
1) criptografando a senha do usuário
//varialvel global
var
s : string[255]; // routine cript
c : array[0..255] of Byte absolute s; // routine cript
//gravar senha criptografada
procedure TfrmUsuarios.btn_salvarClick(Sender: TObject);
var
i:integer; // routine cript
begin
s:=DBEdit5.text;
For i:=1 to ord(s[0]) do
c[i] := 23 XOr c[i];
dmDados.cds_usuariosSENHA.AsString:=s;
inherited;
end;
2) comparando a senha informada, com a que está no Banco de dados.
// variavel global
var
frmLogin: TfrmLogin;
strlogin: string;
contaerros: integer;
s : string[255]; // routine cript
c : array[0..255] of Byte absolute s; // routine cript
implementation
uses Uprincipal;
{$R *.dfm}
//******************************************************************************
procedure TfrmLogin.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_RETURN) then
perform(WM_NEXTDLGCTL,0,0);
end;
//******************************************************************************
procedure TfrmLogin.FormShow(Sender: TObject);
begin
contaerros:=0;
end;
//******************************************************************************
procedure TfrmLogin.btn_cancelarClick(Sender: TObject);
begin
Application.Terminate;
end;
//******************************************************************************
procedure TfrmLogin.senhaChange(Sender: TObject);
//starting routine of encriptation /// start
var
i:integer;
begin
s:=senha.text;
For i:=1 to ord(s[0]) do
c[i] := 23 XOr c[i];
slave.Text:=s;
//ending routine of encriptation /// end
end;
//******************************************************************************
procedure TfrmLogin.btn_okClick(Sender: TObject);
begin
if contaerros = 3 then
begin
frmlogin.Visible:=false;
showmessage(´Acesso negado, favor entrar em contado com o Administrador do Sistema.´);
Application.Terminate;
end
else
strlogin:=´select * from USUARIOS, PERFIL where USUARIOS.NIVEL = PERFIL.ID ´;
strlogin:=strlogin + ´ and LOGIN = ´ + 39 + (usuario.Text) + 39;
strlogin:=strlogin + ´ and SENHA = ´ + 39 + (slave.Text) + 39;
dmdados.sqdset_loginuser.Close;
dmdados.sqdset_loginuser.CommandText:=´´;
dmdados.sqdset_loginuser.CommandText:=(strlogin);
dmdados.sqdset_loginuser.Open;
if(dmdados.sqdset_loginuser.RecordCount) = 1 then //se a consulta foi realizada com sucesso...
begin
frmprincipal:=Tfrmprincipal.create(Application);
frmprincipal.ShowModal;
end
else
showmessage(´Nome de usuário ou senha inválidos!!!´);
contaerros:=contaerros + 1;
end;Esta é a solução que eu uso. Para mim funciona perfeitamente. Espero ter ajudado.
GOSTEI 0