Olá! Seja bem-vindo!
Hoje veremos como gerenciar senhas com segurança no SQL Server, usando apenas funções e recursos do próprio SQL, sem você precisar ficar criando nenhum código mirabolante e complicado.
Um breve histórico
Quando a computação começou, senhas eram guardadas em texto puro, sem nenhum tipo de criptografia. Como você pode imaginar, muitas aplicações até hoje fazem isso, o que é uma prática “não recomendada” em termos de segurança.
Falando de banco de dados, se você guarda uma senha em texto, qualquer pessoa com acesso de SELECT poderá ler as senhas e também alterá-la com um simples UPDATE.
Para resolver esse problema, os programadores costumavam criar códigos para ocultar ou criptografar as senhas, o que funcionou bem por um tempo, porém manter o código atualizado para ser resistente a hackers com poder computacional crescente e ficar migrando ele de plataforma ao longo da vida útil do software gera um trabalho adicional que hoje é desnecessário devido as plataformas padronizadas de criptografia existentes no SQL por exemplo.
Então, para facilitar a nossa vida, o ideal hoje em dia é usar padrões de mercado.
Criptografia vs. Hash
Para guardar senhas recomenda-se o uso de algoritmos de hash e não de criptografia. A diferença entre esses dois algoritmos é que criptografia pode ser revertida, hash é irreversível. Veja na imagem abaixo o fluxo de dados:
Gerenciar Senhas com Segurança no SQL Server
------------------------------------------------------------------ -- Como armazenar e verificar senhas no SQL Server ------------------------------------------------------------------ -------------------------------------------------- -- Credenciais em texto -------------------------------------------------- create table #credenciais_texto ( usr varchar(100) not null primary key, pwd varchar(100) not null ) insert into #credenciais_texto values ('josue', 'senha-do-josue') select * from #credenciais_texto -------------------------------------------------- -- Credenciais com criptografia própria -------------------------------------------------- create table #credenciais_cripto_propria ( usr varchar(100) not null primary key, pwd varchar(100) not null ) insert into #credenciais_cripto_propria values ('josue', '42545B59511C555E1D5B5F474C52') select * from #credenciais_cripto_propria -------------------------------------------------- -- Credenciais com HASH no SQL -------------------------------------------------- -- Geração básica de hash: select hashbytes('md5', 'senha-do-josue') -- Comparação de hashes declare @ds_senha varchar(100) = 'minha_senha' print 'Senha..........: ' + @ds_senha print 'Hash md2.......: ' + convert(varchar(300), hashbytes('md2', @ds_senha), 2) -- convert(varchar, xx, 2) = Conversão hexadecimal para texto print 'Hash md4.......: ' + convert(varchar(300), hashbytes('md4', @ds_senha), 2) print 'Hash md5.......: ' + convert(varchar(300), hashbytes('md5', @ds_senha), 2) print 'Hash sha1......: ' + convert(varchar(300), hashbytes('sha1', @ds_senha), 2) print 'Hash sha2_256..: ' + convert(varchar(300), hashbytes('sha2_256', @ds_senha), 2) print 'Hash sha2_512..: ' + convert(varchar(300), hashbytes('sha2_512', @ds_senha), 2) go -- Tabela de armazenamento (campo de senha em varbinary) create table #credenciais_hash ( usr varchar(100) not null primary key, pwd varbinary(1000) not null ) -- Guardando senhas insert into #credenciais_hash values ('josue', hashbytes('sha2_512', 'senha_do_josue')) insert into #credenciais_hash values ('maria', hashbytes('sha2_512', 'senha_da_maria')) select * from #credenciais_hash go -- Teste de acesso declare @usr varchar(100) = 'josue' declare @pwd varchar(300) = 'senha_digitada_na_tela_do_sistema' if hashbytes('sha2_512', @pwd) = (select pwd from #credenciais_hash where usr = @usr) print 'Acesso OK' else print 'Acesso NEGADO' -------------------------------------------------- -- Excluindo dados de teste -------------------------------------------------- drop table #credenciais_texto, #credenciais_cripto_propria, #credenciais_hash
CONCLUSÃO
Já foi difícil, mas hoje em dia é uma moleza gerenciar senhas de forma segura. Mesmo que sua aplicação seja desenvolvida em uma plataforma antiga, que não possua padrões novos de criptografia prontos para uso, você pode aproveitar o próprio banco de dados para gerenciar senhas com segurança no SQL Server ou em outros bancos modernos.
Então não deixe de fazer isso, pois é fácil, mais profissional e seguro.
Abraço do seu amigo Josué 🙂