Hola, chicos,
¡Buenas noches!

En esta publicación, demostraré cómo cifrar y descifrar contraseñas con CLR (C#). Para hacer esto, usaré los algoritmos de cifrado MD5CryptoServiceProvider y TripleDESCryptoServiceProvider de .NET Framework, que le permiten usar una palabra clave (Salt) para garantizar que esta clave se usará para cifrar los datos y solo se puede descifrar usando esta palabra clave secreta.

Si es nuevo en CLR y le gustaría saber más sobre esta poderosa característica de SQL Server, accede a este enlace.

Ver código fuente
Clase Utils.cs:
using System.Security.Cryptography;
using System.Text;

namespace Bibliotecas.Model
{
    public static class Utils
    {
        
        public static TripleDES CreateDES(string key)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            TripleDES des = new TripleDESCryptoServiceProvider();
            des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
            des.IV = new byte[des.BlockSize / 8];
            return des;
        }

    }

}

fncCriptografa_Password.cs:

using System;
using System.Data.SqlTypes;
using System.Text;
using Bibliotecas.Model;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString fncCriptografa_String(SqlString Ds_Senha)
    {

        if (Ds_Senha.IsNull)
            return SqlString.Null;

        if (string.IsNullOrEmpty(Ds_Senha.Value))
            return SqlString.Null;

        const string salt = "http://dirceuresende.com/";
        var des = Utils.CreateDES(salt);
        var ct = des.CreateEncryptor();
        var input = Encoding.Unicode.GetBytes(Ds_Senha.Value);
        var retorno = "!=!enC!=!" + Convert.ToBase64String(ct.TransformFinalBlock(input, 0, input.Length));

        return retorno;

    }
    
}

fncDescrypta_String.cs

using System;
using System.Data.SqlTypes;
using System.Text;
using Bibliotecas.Model;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString fncDescriptografa_String(SqlString Ds_Senha)
    {

        if (Ds_Senha.IsNull)
            return SqlString.Null;

        if (string.IsNullOrEmpty(Ds_Senha.Value))
            return SqlString.Null;

        var senhaCriptografada = Ds_Senha.Value.Replace("!=!enC!=!", string.Empty);

        var b = Convert.FromBase64String(senhaCriptografada);

        const string salt = "http://dirceuresende.com/";
        var des = Utils.CreateDES(salt);
        var ct = des.CreateDecryptor();
        var output = ct.TransformFinalBlock(b, 0, b.Length);
        var retorno = Encoding.Unicode.GetString(output);

        return retorno;

    }
    
}

Ejemplos de uso

Cifrar datos

sql-server-how-to-encrypt-strings-passwords-md5cryptoserviceprovider-tripledescryptoserviceprovider
servidor-sql-cómo-cifrar-cadenas-contraseñas-md5cryptoserviceprovider-tripledescryptoserviceprovider

Descifrando datos

sql-server-how-to-decrypt-strings-passwords-md5cryptoserviceprovider-tripledescryptoserviceprovider
servidor-sql-cómo-descifrar-cadenas-contraseñas-md5cryptoserviceprovider-tripledescryptoserviceprovider

Esta implementación no forma parte de los algoritmos criptográficos validados FIPS de la plataforma Windows.

Si compiló su ensamblado CLR en un servidor que ejecuta Windows Server, probablemente encontrará este mensaje de error al intentar ejecutar estas dos funciones en la publicación.

Mensaje 6522, Nivel 16, Estado 1, Línea 6
Se produjo un error de .NET Framework durante la ejecución de la rutina definida por el usuario o del agregado “fncCriptografa_String”:
System.InvalidOperationException: esta implementación no forma parte de los algoritmos criptográficos validados FIPS de la plataforma Windows.
System.InvalidOperationException:
en System.Security.Cryptography.MD5CryptoServiceProvider..ctor()
en Bibliotecas.Model.Utils.CreateDES(Clave de cadena)
en UserDefinedFunctions.fncCriptografa_String(SqlString Ds_Password)

Esto ocurre porque los algoritmos utilizados (MD5CryptoServiceProvider y TripleDESCryptoServiceProvider) no cumplen con el estándar FIPS de Microsoft.

Este problema es similar al que informé en la publicación. Servicios de informes de SQL Server: informe de error al guardar: System.InvalidOperationException Esta implementación no forma parte de los algoritmos criptográficos validados FIPS de la plataforma Windows., pero usaré una solución diferente para este caso.

Para que puedas utilizar estas funciones en tu servidor, te presentaré dos soluciones para solucionar este problema:

Opción 1: deshabilitar FIPS
Para deshabilitar esta configuración, simplemente acceda al registro de Windows, busque la configuración "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\fipsalgorithmpolicy" y cambie el valor de la clave "Enabled" a 0.

SQL Server Reporting Services 2016 - Disable FIPS
SQL Server Reporting Services 2016: deshabilitar FIPS

Después de eso, reinicie el servicio SQL Server y podrá utilizar estas funciones normalmente.

Opción 2: cambiar el archivo sqlservr.exe.config de SQL Server
Una forma de resolver este problema sin tener que deshabilitar esta política de seguridad (si está habilitada, el analista de seguridad de su empresa probablemente piense que es una buena opción) es cambiar el archivo sqlservr.exe.config, generalmente ubicado en C:\Archivos de programa\Microsoft SQL Server\MSSQL12.Nombre_de_su_instancia\MSSQL\Binn y agregue la siguiente configuración al final del archivo, dentro de la sesión :

<enforceFIPSPolicy enabled="0" />

Su archivo debería verse así:

sql-server-this-implementation-is-not-part-of-the-windows-platform-fips-validated-cryptographic-algorithms-sqlservr-exe-config
sql-server-esta-implementación-no-es-parte-de-la-plataforma-windows-algoritmos-criptográficos-validados-fips-sqlservr-exe-config

Después de cambiar el archivo, reinicie el servicio SQL Server. Este cambio deberá realizarse en todos los casos en los que utilice esta función.

Otra alternativa es realizar este cambio en el máquina.config de la máquina (generalmente ubicado en C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config), pero tenga en cuenta que al usar esta solución, deshabilitará esta opción para TODAS las aplicaciones .NET en el servidor.

Algoritmos de cifrado compatibles y no compatibles

Consulte también la lista siguiente para identificar qué algoritmos son compatibles y cuáles no con el espacio de nombres "System.Security.Cryptography":

Algoritmos hash
– HMACSHA1
– MACTripleDES
– Proveedor de servicios criptográficos SHA1

Algoritmos simétricos (Utilice la misma clave para cifrar y descifrar)
– DESCryptoServiceProvider
– TripleDESCryptoServiceProvider

Algoritmos asimétricos (Utilice una clave pública para cifrar y una clave privada para descifrar)
– DSACryptoServiceProvider
– RSACryptoServiceProvider

Algoritmos que no soportan los estándares FIPS (y no debe usarse)
– HMACMD5
– HMACRIPEMD160
– HMACSHA256
– HMACSHA384
– HMACSHA512
– MD5CryptoServiceProvider
– Proveedor de servicios RC2Crypto
– RijndaelGestionado
– RIPEMD160Administrado
– SHA1Administrado

¡Eso es todo, amigos!
Espero que te haya gustado el post.

Un abrazo y hasta la próxima.