Fórum Criptografar/Descriptografar senha #254005

11/10/2004

0

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]


Barbara.michele

Barbara.michele

Responder

Posts

11/10/2004

Ehvasc

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


Responder

Gostei + 0

11/10/2004

Barbara.michele

Como então com esse código poderia fazer isso?

Obrigada


Responder

Gostei + 0

13/10/2004

Programalista

Olá Barbara, esta é a rotina que uso para comparar a senha criptografado do usuário, com a senha criptografa no banco.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar