Fórum Problema criptografia senha update #394560
27/01/2011
0
Tenho um formulario de cadastro de usuario e utilizo uma rotina para criptografar a senha.
Utilizo o componente ZQuery.
Quando incluo o usuario esta ok, a senha grava no banco criptografada, mas quando faço uma alteracao neste usuario esta acontecendo que criptografa a senha ja criptografada novamente. Como devo proceder para corregir isso.
o beforepost coloquei esta linha
Ado_Usuario.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
fico no aguardo.
Iramar Junior
Curtir tópico
+ 0Posts
27/01/2011
Marcelo Diniz
Tenho um formulario de cadastro de usuario e utilizo uma rotina para criptografar a senha.
Utilizo o componente ZQuery.
Quando incluo o usuario esta ok, a senha grava no banco criptografada, mas quando faço uma alteracao neste usuario esta acontecendo que criptografa a senha ja criptografada novamente. Como devo proceder para corregir isso.
o beforepost coloquei esta linha
Ado_Usuario.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
fico no aguardo.
Na alteração verifique se a senha foi alterada pelo usuário ou não, se não retire o campo senha do update, se foi pegue o novo valor e salve ele.
Ex.: Var SenhaAtual, NovaSenha : string;
SenhaAtual := Ado_Usuario.FieldByName('SENHA').AsString;NovaSenha := DBEdSenha.text ;
if SenhaAtual <> NovaSenha then Ado_Usuario.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
Gostei + 0
27/01/2011
Marcelo Diniz
Corrigindo o código acima.
Var SenhaAtual, NovaSenha : string;
SenhaAtual := Ado_Usuario.FieldByName('SENHA').AsString;NovaSenha := Encrypt(EditSenha.Text, chave);
if SenhaAtual <> NovaSenha then Ado_Usuario.FieldByName('SENHA').AsString := NovaSenha;
Gostei + 0
27/01/2011
Marco Salles
procedure TSeuFormulario.SeuDataSetTQUERY1BeforePost(DataSet: TDataSet);
begin
if DataSet.State in [DsInsert] then
DATASET.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
end;
Gostei + 0
27/01/2011
Wilson Junior
DATASET.FieldByName('SENHA').AsString := Descrypt(EditSenha.Text, chave);
E no evento OnBeforePost:
DATASET.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
Espero ter colaborado.
Gostei + 0
27/01/2011
William Galleti
Acho que a melhor pratica mesmo é a questão de comparação de senhas.
Eu faço assim...
No AfterOpen do ClientDataSet alimento uma variável global SenhaOld : string.
No botão gravar eu verifico se a senha é igual a da variável SenhaOld . Se não for, mando criptografar e boa...
//codigo afteropen SenhaOld := cdsPadraoPasswd.AsString; //codigo btnGravar if SenhaOld <> edtSenha.Text then begin cdsPadrao.Edit; cdsPadraoPasswd.AsString := MD5.MD5Print(MD5String(cxDBTextEditSenha.Text)); cdsPadrao.Post; end;
No meu caso ta com ClientDataSet, adeque a sua necessidade
Espero ter ajudado.
Gostei + 0
27/01/2011
Efraim Santana
apenas um ajuste no codigo.
//codigo afteropen SenhaOld := cdsPadraoPasswd.AsString; //codigo btnGravarvar novasenha : String; novasenha := MD5.MD5Print(MD5String(cxDBTextEditSenha.Text)); if SenhaOld <> novasenha then begin cdsPadrao.Edit; cdsPadraoPasswd.AsString := novasenha; cdsPadrao.Post; end;
Gostei + 0
27/01/2011
Marco Salles
Mas ou Vcs não entenderam o problema dele ou eu não entendi . Será que eu entendi tão errado assim ???
Me corrijam :
1) Quando incluo o usuario esta ok ... Ele esta inserindo sem problema nehum
2)mas quando faço uma alteracao esta acontecendo que criptografa a senha ja criptografada novamente. pq esta ocorrendo isto ????? Ora pq beforepost esta Criptogravando o valor do EditSenha.Text , que pode estar em branco ou conter um Lixo qualquer porque pode ser uma simples alteração de Telefone por exemplo.. Ele não esta Reclamando de Alteração De Senha Então durante um processo de alteração (não de Senha) ele não pode executar a instrução
Ado_Usuario.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave); So isso gente !!!!! nada mais do que isso Agora a alteração de senha é um processo que não foi tratado pq não foi pedido , pelo menos a meu ver . Para Alteração de senha sugiro um Form separado com algumas particularidades . O Paulista mandou tb uma opção que para mim ele entendeu o espirito da dúvida . Ele coloca no valor do Edit um Valor Descriptografado no evento e depois o Criptograva , não aterando o seu conteudo .Tb funciona . So que o evento mais indicado para isto seguindo a sua iéia é o evento BeforeEdit e sem testar para mim é a solução que não precisa de outros arranjos
DATASET.FieldByName('SENHA').AsString := Descrypt(EditSenha.Text, chave);
E no evento OnBeforePost:
DATASET.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
Espero ter colaborado.
Gostei + 0
28/01/2011
Iramar Junior
Fiz todos os testes e nao consegui resolver o problema, pelo visto vou ter modificar meu projeto deixando cadastrar os usuarios e desenvolver um form para cadastro e alteracao da senha.
Acho que foi isso a ideia que o Marco teve também.
Algum de vcs teria uma exemplo de como poderia fazer isso sem ter que alterar muito no meu projeto?
Minha ideia seria verificar se o campo senha é nulo, se for so ira pedir a senha e repetir a senha e confirmar, senao, será solicitado a senha atual e so depois de validar a senha que sera solicitado a nova senha e repetir para confirmar a alteracao.
Continuo esperando ajuda e sugestoes.
Obrigado
Gostei + 0
28/01/2011
Marco Salles
No evento OnBeforeEdit(acho que é este):
#Código
DATASET.FieldByName('SENHA').AsString := Descrypt(EditSenha.Text, chave);
E no evento OnBeforePost:
#Código
DATASET.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
Espero ter colaborado.
Na minha opinião ... Errado esta pq qualquer um Pode alterar a senha de qualquer um Deste que coloque o DataSet em modo de edição e coloque um Valor para o Edit Mas certo esta , porque resolveu o seu problema inicial ???? Acredito eu Então estamos 50% para lá e 50% para cá . Pergunto isto , pq será mais fácil atacar o problema desse ponto , sem ter que efetuar muitas alteraçoes no codigo Ultima pergunta ... Patrocineo perto de muriaé ??? Mg
Gostei + 0
28/01/2011
Iramar Junior
Resolveu em parte, pq só e decriptografado caso o cursor passar pelo edit, caso contrario continua criptografando a senha que ja esta criptografada....
Sem duvida creio que a solucao esta em criar outro form...
Cidade Patrocinio proxima a Uberlandia
Gostei + 0
28/01/2011
Marco Salles
Resolveu em parte, pq só e decriptografado caso o cursor passar pelo edit, caso contrario continua criptografando a senha que ja esta criptografada....
Ta errado ... O Certo é assim
EditSenha.Text:= Descrypt(DATASET.FieldByName('SENHA').AsString,chave);
Isto é , o conteudo do edit recebe o conteudo do campo senha descriptografada
Agora sim , na hora de gravar o campo recebe o conteudo do edit Criptografado
E no evento OnBeforePost:
DATASET.FieldByName('SENHA').AsString := Encrypt(EditSenha.Text, chave);
Patrocicineo perto de uberlandia .. Sei ja ouvi falar . Aqui perto de minha cidade tem uma cidade com o mesmo nome da sua
Gostei + 0
28/01/2011
Iramar Junior
Quando clico no botao editar ja faz a decriptografia da senha, assim sendo quando gravo, mesmo sem alterar a senha ela é criptografada corretamente.
Nao gostaria que fosse assim pq existem programas que consegue ver a senha mesmo estando mascarada com qualquer caracter, mas em tese resolveu o problema.
Continuo com a ideia inicial de criar um form separado somente para cadastrar e alterar a senha, como vc (Marco) mesmo disse anteriormente, so nao entendi o que quiz dizer com algumas particularidades.
Gostaria de me ajudar a desenvolver este form?
Agradeço.
Gostei + 0
28/01/2011
Wilson Junior
Tenho um form para alteração dos dados do usuário e neste tenho um botão q chama outro form para alterar a senha, quando entro neste, peço a senha atul e a nova senha e sua confirmação da nova senha. ao dar OK neste form, descriptografo a senha atual para comparar com a senha atual informada, se for igual, atribuo a nova senha ao campo do ClientDataSet, sendo assim ele sempre irá criptografar a nova senha, mas para o caso de alterar os dado do usuário e não alterar a senha, utilizo, sempre o evento OnBeforeEdti, conforme o Marco citou, como maneira de desripitografar q senha, pois assim sempre tenho o contéudo da senha, mas sem mostrar para o usuário.
Espero ter colaborado.
Gostei + 0
28/01/2011
Marco Salles
Nao gostaria que fosse assim pq existem programas que consegue ver a senha mesmo estando mascarada com qualquer caracter, mas em tese resolveu o problema.
Continuo com a ideia inicial de criar um form separado somente para cadastrar e alterar a senha, como vc (Marco) mesmo disse anteriormente, so nao entendi o que quiz dizer com algumas particularidades.
visivel ????? .... Resposta é Não .. So precisa ficar Visivel na Inserção de novo usário vamos continuar o aclopamento .. No before Insert Coloque o Edit como Visibel:=True e No AfterPost Coloque o Edit Como Visible:=False e no AfterCancel tn o Edit Como Visible:=False Pronto seu problema com programas que consegue ver a senha esta Resolvido . O Conteudo do Edit com a senha não aparecera mais ... Agora vamos a criação do Form para Alterar a Senha Crie um Formulario com Tres edites e dois Butoes .... o Primeiro é onde o usuário ira informar a Senha Atual O Segundo a Alteracao e o Terceiro a nova senha Para cada um dos botoes Altere a propriedade modalResult para mrOk e para o segundo altere para mrCancel Define para este formulario
private
{ Private declarations }
FOldsenha:String;
public
{ Public declarations }
constructor Create(Aowner:Tcomponent;out StrSenha:String);reintroduce;
end;
var
FrmSenha: TFrmSenha;
implementation
{$R *.dfm}
{ TForm1 }
constructor TFrmSenha.Create(Aowner:Tcomponent;out StrSenha:String);
begin
inherited Create(Aowner);
FoldSenha:=StrSenha;
end;
procedure TForm6.Button2Click(Sender: TObject);
var
formulario:Tform;
oldSenha:String;
begin
oldSenha:= SeuDataSet.FieldByName('Senha').AsString;
formulario:=TFrmSenha.Create(nil,oldSenha);
try
if formulario.ShowModal = mrOk then
begin
editSenha.text:=oldSenha;
SeuDataSet.Edit;
SeuDataSet.Post;
end;
finally
formulario.Free;
formulario:=nil;
end;
end;
Gostei + 0
28/01/2011
Iramar Junior
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)