Jump to content
nando4

Ajuda: Encriptar passwords no SQL server

Recommended Posts

nando4

Boas

Eu estou a fazer um software de gestão para projecto final de curso e queria que quando criasse um novo utilizador, ao guardar o username e a password na BD(SQL Server 2005) encriptasse estes campos e quando fizesse o login no programa desencriptasse estes campos.

Se alguém me poder ajudar agradecia.

Abraço.

Share this post


Link to post
Share on other sites
Caça

Converte a String para Base64


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
M6

Tipicamente as passwords são apenas encriptadas e nunca desencriptadas.

A comparação é feita com encriptada e como tal a password nunca volta ao seu estado original.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
nando4

Obrigado, então fica alguma coisa deste género?

SqlCommand command = new SqlCommand("Insert into utilizadores(nome,username,pass,id_tipo) values('" + tb_nome.Text + "','" + Convert.ToBase64String(tb_user.Text); + "','" + Convert.ToBase64String(tb_pass.Text); + "','" + id + "')", liga);

Abraço

Share this post


Link to post
Share on other sites
nando4

Andei a pesquisar na net e encontrei isto:

byte[] pass = System.Text.Encoding.UTF8.GetBytes(tb_pass.Text);
            Convert.ToBase64String(pass);
            //

            textBox1.Text = Convert.ToString(pass);

Mas da-me um erro, experimentei apresentar a password encriptada numa textBox e aparece me: System.Byte[]

E também queria saber se é obrigatório a variavel pass ser bite[]

Cumps

Share this post


Link to post
Share on other sites
nando4

Muito Obrigado jpaulino ajudas te muito, usei o método Triple DES.

Abraço

Share this post


Link to post
Share on other sites
f-22

Tipicamente o que se faz, e fazendo 1 pequeno reparo ao M6, é gerar um HASH da password e guardar o HASH resultante.

Sempre que queiras ver se uma password está bem ou mal para um determinado user, o que vais fazer é gerar o HASH para o que o utilizador introduziu e comprar com o HASH que esá na base de dados.

Porque se usa HASH? Porque os algoritmos de Hash são de 1 sentido só, ou seja, pegas em qualquer coisa geras o HASH, mas não consegues pegar no HASH e gerar aquilo que deu origem a esse HASH.

Se encriptares as password's, imagina que te roubam a base de dados e o código, é possivel reverter as password's todas. Com o Hash não.

Share this post


Link to post
Share on other sites
M6

f-22, permite-me fazer-te um reparo também: uma função de HASH não é uma função de encriptação.

Além disso o HASH não necessita de ser revertido para teres a tua segurança comprometida. E muito menos necessitas que te roubem o código e a base de dados, o HASH pode ser quebrado sem esse cenário catastrófico e altamente improvável...


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
f-22

Mas onde é que eu digo que HASH é encriptação? Se eu refiro que o algoritmo é só de 1 sentido...

Alem disso, o que tentei demonstrar foi o porquê de usar HASH e não a encriptação. Algoritmos de HASH (estou a falar genéricamente) não são quebraveis. O que se faz por ai é "quebrar" mas é por bruteforce. Vais gerando e vais guardando os resultados e o que deu origem a esses resultados.

Cumprimentos

Share this post


Link to post
Share on other sites
M6

f-22, não referi que tinhas dito que uma função de HASH é encriptação, mas o tópico (bem visivel no título) refere encriptação, daí ter esclarecido o assunto.

Também para esclarecer, a quebra do HASH já não é feita pela força bruta há algum tempo. Há já alguns anos que é possível quebrar o HASH de forma mais eficiente. Esse tema já foi largamente discutido aqui no fórum, se tiveres curiosidade procura porque é uma discussão interessante.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
nando4

Boas

Eu usei o metodo tripleDES mas tenho um problema, no meu programa tenho uma parte na administração que permite ao utilizador (desde que tenha permissões de administrador) alterar dados de uma conta de utilizador mas se o utilizador alterar a password depois nao consegue fazer o login.

private void Alterar()
        {
            liga.Open();
            try
            {
                //encripta a password
                byte[] buffer = Encryption(tb_pass_ant.Text, tb_user.Text);//encripta com base na pass e no id_user
                string pass = Convert.ToBase64String(buffer);

                //faz a vrificação a password actual para poder alterar o resto dos dados
                SqlCommand cmd = new SqlCommand("Select count(*) From utilizadores Where pass = '"+pass+"' and username = @user", liga);
                cmd.Parameters.Add(new SqlParameter("@password", tb_pass_ant.Text));//ATRIBUICAO DE VARIAVEIS AS textBox
                cmd.Parameters.Add(new SqlParameter("@user", cb_nome.Text));
                int valor = (int)cmd.ExecuteScalar();

                //se valor == 1 login correcto
                if (valor == 1)
                {
                    //vai buscar o id_tipo de user para saber o nome_tipo
                    SqlCommand cmd2 = new SqlCommand("SELECT id_tipo FROM tipo_utilizador WHERE nome_tipo = '" + cb_tipo.Text + "'", liga);
                    Int32 id = (Int32)cmd2.ExecuteScalar();

                    //encripta a password
                    byte[] buffer1 = Encryption(tb_pass_nova.Text, tb_user.Text);
                    string pass1 = Convert.ToBase64String(buffer);

                    //altera os dados na BD
                    SqlCommand cmd1 = new SqlCommand("UPDATE utilizadores SET nome = '" + tb_nome.Text + "', username = '" + tb_user.Text + "', pass = '" + pass1 + "', id_tipo = '" + id + "' WHERE username = '" + cb_nome.Text + "'", liga);
                    cmd1.ExecuteNonQuery();
                    MessageBox.Show("Os dados foram alterados com sucesso.", "Software de Gestão");
                    Limpar();
                }
                else
                {
                    //se a password estiver errada a label fica vermelha
                    label6.ForeColor = System.Drawing.Color.Red;

                    MessageBox.Show("A Password está incorrecta, por favor tente novamente ou contacte o Administrador.", "ERRO");
                    tb_pass_nova.Text = "";
                    tb_re_pass.Text = "";
                    tb_pass_ant.Text = "";
                    tb_pass_ant.Focus();
                }
            }
            catch (Exception a)
            {

                DialogResult resp = MessageBox.Show("Ocorreu um erro ao alterar os dados.\nDeseja ver detalhes?", "Base de dados", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk);
                if (resp == System.Windows.Forms.DialogResult.Yes)//SE A RESP FOR YES
                {
                    MessageBox.Show(a.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
            
            liga.Close();
        }

Eu penso que seja por causa desta parte:

byte[] buffer = Encryption(tb_pass_ant.Text, tb_user.Text);

Se alquem me poder ajudar agradecia

Cumps

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.