Fórum Criptografar/Descriptografar senha #254005
11/10/2004
0
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
Curtir tópico
+ 0Posts
11/10/2004
Ehvasc
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
11/10/2004
Barbara.michele
Obrigada
Gostei + 0
13/10/2004
Programalista
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)