Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como criptografar e descriptografar senhas (com Salt) utilizando o CLR (C#)

Post Views 10,025 views
Reading time 4 minutes

Olá pessoal,
Boa noite!

Neste post, vou demonstrar como criptografar e descriptografar senhas com o CLR (C#). Para isso, vou utilizar os algoritmos de criptografia MD5CryptoServiceProvider e TripleDESCryptoServiceProvider do .NET Framework, que permitem utilizar uma palavra-chave (Salt) para garantir que essa chave será utilizada na criptografia dos dados e somente poderá ser descriptografada utilizando essa palavra-chave secreta.

Se você não conhece o CLR e gostaria de saber mais sobre esse poderoso recurso do SQL Server, acesse este link.

Visualizar código-fonte
Classe Utils.cs:

fncCriptografa_Senha.cs:

fncDescriptografa_String.cs

Exemplos de uso

Criptografando dados
sql-server-how-to-encrypt-strings-passwords-md5cryptoserviceprovider-tripledescryptoserviceprovider

Descriptografando dados
sql-server-how-to-decrypt-strings-passwords-md5cryptoserviceprovider-tripledescryptoserviceprovider

This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms

Se você compilou o seu assembly CLR em um servidor rodando o Windows Server, provavelmente você encontrará essa mensagem de erro ao tentar executar essas duas funções do post.

Msg 6522, Level 16, State 1, Line 6
A .NET Framework error occurred during execution of user-defined routine or aggregate “fncCriptografa_String”:
System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
System.InvalidOperationException:
at System.Security.Cryptography.MD5CryptoServiceProvider..ctor()
at Bibliotecas.Model.Utils.CreateDES(String key)
at UserDefinedFunctions.fncCriptografa_String(SqlString Ds_Senha)

Isso ocorre, pois os algoritmos utilizandos (MD5CryptoServiceProvider e TripleDESCryptoServiceProvider) não estão em conformidade com o padrão FIPS da Microsoft.

Esse problema é parecido com o que relatei no post SQL Server Reporting Services – Erro ao Salvar Relatório: System.InvalidOperationException This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms., mas utilizarei uma solução diferente para este caso.

Para que você possa utilizar essas funções em seu servidor, vou apresentar duas soluções para resolver esse problema:

Opção 1: Desativar o FIPS
Para desativar essa configuração, basta acessar o registro do Windows, encontrar a configuração “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\fipsalgorithmpolicy” e alterar o valor da chave “Enabled” para 0.

SQL Server Reporting Services 2016 - Disable FIPS

Após isso, reinicie o serviço do SQL Server e você conseguirá utilizar essas funções normalmente.

Opção 2: Alterar o arquivo sqlservr.exe.config do SQL Server
Uma forma de resolver esse problema sem precisar desativar essa política de segurança (se está ativada, provavelmente o analista de segurança da sua empresa acha que é uma boa opção) é alterando o arquivo sqlservr.exe.config, geralmente localizado em C:\Program Files\Microsoft SQL Server\MSSQL12.Nome_Da_Sua_Instancia\MSSQL\Binn e adicionar a seguinte configuração ao final do arquivo, dentro da sessão <runtime>:

O seu arquivo deverá ficar assim:
sql-server-this-implementation-is-not-part-of-the-windows-platform-fips-validated-cryptographic-algorithms-sqlservr-exe-config

Após alterar o arquivo, reinicie o serviço do SQL Server. Essa alteração precisará ser feita em todas as instâncias onde você irá utilizar essa função.

Uma outra alternativa, é realizar essa alteração no machine.config da máquina (Geralmente localizado em C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config), mas tenha em mente que utilizando essa solução, você irá desativar essa opção para TODAS as aplicações .NET do servidor.

Algoritmos de criptografia suportados e não suportados

Veja também, a lista abaixo para identificar quais são os algoritmos suportados e quais não são pelo namespace “System.Security.Cryptography”:

Algoritmos Hash
– HMACSHA1
– MACTripleDES
– SHA1CryptoServiceProvider

Algoritmos Simétricos (Usam a mesma chave para criptografia e descriptografia)
– DESCryptoServiceProvider
– TripleDESCryptoServiceProvider

Algoritmos Assimétricos (Usam uma chave pública para criptografia e uma chave privada para descriptografia)
– DSACryptoServiceProvider
– RSACryptoServiceProvider

Algoritmos que não suportam os padrões do FIPS (e não devem ser utilizados)
– HMACMD5
– HMACRIPEMD160
– HMACSHA256
– HMACSHA384
– HMACSHA512
– MD5CryptoServiceProvider
– RC2CryptoServiceProvider
– RijndaelManaged
– RIPEMD160Managed
– SHA1Managed

And that's it, folks!
Espero que tenham gostado do post.

Um abraço e até a próxima.