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é 🙂