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) 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 :)