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

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *