1. Seguridad Principios de seguridad. Implementación de seguridad de acceso de código. Implementación de seguridad basada en roles. Uso de los servicios de criptografía.
2. Seguridad Principios de seguridad – Arquitectura en .NET En los sistemas operativos Windows, la seguridad y el control de acceso a los recursos del sistema están basados en la identificación de usuario. Una vez que el usuario se ha identificado en el sistema, todo el código que ejecute tendrá acceso a todos los recursos que dicho usuario tenga a su disposición. Esta es una "vulnerabilidad" habitualmente aprovechada por todo tipo de código malicioso y hackers para hacerse con el control de nuestras máquinas, ya que las solemos utilizar con usuarios con todos los privilegios. .NET Framework añade una capa de seguridad a la del sistema operativo con los siguientes complementos: Permisos de seguridad. Seguridad de tipos. Políticas de seguridad. Autentificación. Autorización.
3. Seguridad Principios de seguridad – Arquitectura en .NET. Permisos de seguridad: El CLR permitirá al código en ejecución efectuar sólo aquellas operaciones a las que esté autorizado a ejecutar utilizando permissions para ello. Seguridad de tipos: Ya se ha comentado la importancia que tiene este tema dentro del control que efectúa el CLR antes de lanzar cualquier ejecución. Cuando un ensamblado está marcado como type-safe, puede realizarse la ejecución en un entorno aislado, con lo que no se verá afectado pro ninguna acción, ni afectará a otros ensamblados. Políticas de seguridad: Son conjuntos de reglas y autorizaciones de seguridad implementados por los administradores del sistema y aplicadas por el CLR asegurando que el código sólo pueda acceder a los recursos y lanzamiento de ejecuciones de código específicamente autorizados. Autentificación: Asociada a la del sistema y a la seguridad basada en roles para permitir a un determinado usuario identificado el acceso a nuestro código. Autorización: Implementada con la seguridad basada en roles, determina a qué puede tener acceso un determinado usuario o rol.
5. Seguridad Principios de seguridad – Guías de diseño Validación de entrada No fiarse de la entrada de datos de usuario o cualquier otra fuente. Centralizar el enfoque de la validación para asegurar consistencia. No confiar en las validaciones del lado del cliente, validar en servidor. Limitar los tipos y rangos de datos de la entrada. Validar la entrada de datos en cuanto a tipo, tamaño, formato y rango. Autentificación Utilizar contraseñas fuertes, con la ayuda de expresiones reglares son fáciles de validar. Establecer una política de caducidad de contraseñas y desactivación de cuentas. No almacenar JAMÁS las contraseñas como texto plano, Es mejor almacenar un hash y recalcularlo con la entrada del usuario. Encriptar los canales de comunicaciones, para proteger los tokens de seguridad, evitando que con la captura de una cookie se pueda ganar acceso a nuestro sistema. Autorización Utilizar siempre cuentas con privilegios bajos, para proteger el acceso a los recursos. Restringir el acceso a los recursos del sistema: archivos, carpetas, claves de registro, objetos de Active Directory, objetos de base de datos y registro de eventos.
6. Seguridad Principios de seguridad – Guías de diseño Gestión de configuración: Añadir sistemas de seguridad a los interfaces de administración para que sólo puede acceder personal autorizado. No almacenar las configuraciones de seguridad en archivos o, al menos, encriptar esas secciones. Criptografía No desarrollar criptografías personalizadas, por la dificultad de hacerlo adecuadamente, dada su complejidad, usar los del sistema. Utilizar los algoritmos y tamaños de clave adecuados. Proteger las claves de encriptado, con ellas desveladas nuestros datos encriptados dejarán de estar seguros. Sensibilidad de los datos: Gestione los datos secretos con mucho cuidado, no los almacene jamás como texto plano en el código, siempre se puede extraer, encriptelos si no puede evitar su inserción en el código. Maneje la información sensible de usuario cuidadosamente, datos de conexión, códigos de cuenta, tarjetas, … deberán ser solicitadas en el momento adecuado, pero no almacenadas como variables de entorno en memoria.
7. Seguridad Principios de seguridad – Modelos de amenazas En un sistema de Threat modelling evaluaremos y clasificaremos continua y cíclicamente las potenciales amenazas a nuestro sistema y seleccionaremos la técnicas paliativas adecuadas, ya que no se puede proteger un sistema frente a los ataques si no se comprenden estos y su alcance. El modelo STRIDE representa las 6 categorías de amenazas que nuestro sistema deberá afrontar: (Spoofing identity) Impersonación frente al sistema o usurpación de identidad. (Tampering with data) Modificación maliciosa de datos persistidos o en tránsito. (Repudiation) Negación de responsabilidad (yo no he sido). (Information disclosure) Acceso a información reservada por usuario no autorizados. (Denial of service(DoS)) Denegación de servicio por la sobrecarga del servidor o sistema de validación. (Elevation of privilege) Incremento de los privilegios, accediendo a todo el sistema.
8. Seguridad Principios de seguridad – Implementar STRIDE El proceso debe ser iterativo, según lo descrito: Hacer una relación con todas las amenazas conocidas, determinando cuanto puede afectar cada una de ellas a nuestro sistema. Clasificar las amenazas por criticidad o impacto y probabilidad. Para criticidad asignar números entre 1 y 10 (más severo). Para probabilidad, seleccione entre 1 y 10 (menos probable). Calcule el riesgo medio dividiendo criticidad por probabilidad. Seleccione una técnica o tecnología apropiada para mitigar cada amenaza. Vuelve a empezar por el primer paso a medida que el proyecto evolucione, ya que nunca se tiene la imagen completa y todos los hechos al principio de un proyecto y realizar una única pasada puede dejar agujeros de vulnerabilidad a los ataques.
9. Seguridad Seguridad de acceso de código. Nos permite proteger el ordenador frente a ataques de código móvil. Como permitir al código de origen desconocido ejecutarse en un entorno protegido y como evitar que el código marcado como seguro pueda comprometer, voluntaria o involuntariamente, la seguridad. Los elementos que se utilizan son esta técnica son: Building blocks Evidencias Nombres seguros Conjuntos de permisos Code groups Petición de permisos
10. Seguridad Seguridad de acceso de código – Building blocks. La seguridad del sistema operativo permite evitar que los usuario no autorizados tengan acceso al sistema, pero no puede evitar que los usuarios validados descarguen y ejecuten código malicioso. .NET Framework nos suministra la seguridad de acceso del código para proteger al sistema del código malicioso, pero permitir al código móvil ejecutarse de forma segura. Matizando el nivel de confianza basándose en factores cómo el origen y publicador del código. Y especificando la petición de determinado nivel de privilegios de seguridad al sistema operativo: El nivel de privilegios requeridos para ejecutarse. El nivel de privilegios que pueden utilizarse pero no requeridos para ejecutarse. El nivel de privilegios no requeridos y que deben ser explícitamente excluidos.
11. Seguridad Seguridad de acceso de código - Evidencias. Son la denominación de la identificación de la identidad y origen del ensamblado. La información incluida en la evidencia que identifica un ensamblado es, de mayor a menor seguridad: El nombre seguro del ensamblado. El hash criptográfico del ensamblado. La información incluida en la evidencia que muestra el origen de un ensamblado es, de mayor a menor seguridad : El publicador del ensamblado, validado con su firma authenticode. La zona en la que se originó el ensamblado: ordenador local, Intranet o Internet. La ubicación de origen del ensamblado: URL, UNC, path o carpeta local del sistema.
12. Seguridad Seguridad de acceso de código – Nombres seguros. Los Strong Names aseguran que un ensamblado tenga un identificador global único, que luego será usado por el CLR para especificar los permisos requeridos por el ensamblado para ejecutarse correctamente. Un nombre seguro utiliza criptografía de clave pública para asignar el identificador único y una firma digital para asegurar la autenticidad del autor y consta de: El nombre del ensamblado. El número de versión. Información cultural opcional. Una clave pública. Para crear un nombre seguro habremos de: Crear un par de claves criptográficas, mediante la herramienta Sn.exe del SDK o firmando en la pestaña firma de las propiedades del proyecto. Firmar el ensamblado con un nombre seguro usando el par de claves.
13.
14. Code Access Security tool. Es una herramienta de línea de comandos para ve y modificar las políticas. Nota: Se requieren privilegios de administrador para utilizar estas herramientas
21. All Printer AccessPublisher = Adatum Site = Adatum.com SN Key=25 98… Publisher = Microsoft Zone= Internet SNKey = 9F AD… Una jerarquía de code groups All Code Nothing Publisher=Microsoft Read:C:icrosoft Zone=Internet Internet Zone=MyComputer Execution SN Key=25 98… Read:C:datum Site = Adatum.com All Printer Access SN Key = 9F AD… Name = Microsoft Money Read:C:oney SN Key = 9F AD… Name = Microsoft.App Write:C:icrosoft
22. Seguridad Seguridad de acceso de código – Petición de permisos. Es la forma que tenemos de indicarle al CLR, dentro del propio código, que necesidades específicas de permisos se requieren en un momento dado, tanto para reclamar como para denegar, incluso aunque las políticas de seguridad otorguen el permiso. Para ello habremos de utilizar las clases específicas definidas en .NET Framework, todas ellas heredando de CodeAccessPermision, la cual nos provee de los métodos Demand, Assert, Deny, PermitOnly, IsSubsetOf, Intersect y Union. Ejemplo: [C#] using System.IO; using System.Security; using System.Security.Permissions; [assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)] public class Program { public static void Main() { try { StreamWriter writer = File.AppendText("LogFile.txt"); writer.WriteLine("Hello World."); writer.Close(); } catch (SecurityException) { Console.WriteLine("No permission to write to the disk."); } } } [VB] Imports System Imports System.IO Imports System.Security Imports System.Security.Permissions <Assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted:=True)> Module Module1 Sub Main() Try Dim writer As StreamWriter = File.AppendText("LogFile.txt") writer.WriteLine("Hello World.") writer.Close() Catch ex As SecurityException Console.WriteLine("No permission to write to the disk.") End Try End Sub End Module Formato general petición permisos: [C#] [assembly: permission-name(SecurityAction.security-action-value, parameters)] [VB] <Assembly: permission-name(SecurityAction.security-action-value, parameters)>
23. Seguridad Seguridad basada en roles. Es la técnica utilizada para otorgar o denegar permiso de acceso a recursos basándose en el tipo de usuario. Veremos: ¿Qué es una identidad? ¿Qué es un Security Principal? Cómo crear identidades y objetos Principal. Cómo implementar controles de autentificación. Cómo verificar que un Principal tenga un rol específico.
24. Seguridad Seguridad basada en roles - ¿Qué es una identidad? Es un objeto que encapsula la información sobre el usuario o entidad que está siendo validado, como el nombre de usuario y el tipo de autentificación, definido en el espacio de nombres System.Security.Principal . Los tipos de identidad en .NET Framework son: Windows: la de acceso al ordenador, impersonable, clase WindowsIdentity. Genérica: Usando un método de identificación personalizado definido por la aplicación, clase GenericIdentity. Personalizada: Clase nuestra, implementando el interfaz. Todas las clases de identidad implementan el interfaz IIdentity, con las propiedades: Nombre: el del usuario actual, de tipo String. IsAuthenticated: Booleano, identificado o no. AuthenticationType: String indicando el tipo de autentificación.
25. Seguridad Seguridad basada en roles - ¿Qué es un Security Principal? Es un objeto que representa el contexto de seguridad bajo el que está corriendo el código, con su identidad y sus roles , definido en el espacio de nombres System.Security.Principal. Los tipos de Principal en .NET Framework son: Windows principal: el usuario de acceso al ordenador y sus roles (grupos de los que es miembro el usuario), clase WindowsPrincipal. Generic principal: usuarios y roles que existen independientemente de los del sistema y sus roles. Para los métodos de identificación personalizados, clase GenericPrincipal. Custom principal: Información de roles específica de la aplicación, implementando el interfaz. Todas las clases de principal implementan el interfaz IPrincipal, con las propiedades: Identity: recupera el objeto identidad asociado al usuario actual. IsInRole: determina si el usuario actual está en un rol o no.
26. Seguridad Seguridad basada en roles – Cómo crear identidades y objetos principal. Para crear identidades y objetos principal deberemos: Recuperar la identidad del usuario actual de Windows. Crear un Windows principal a partir de dicha identidad. Para crear identidades y objetos principal genéricos: Crear e inicializar un objeto GenericIdentity. Crear e inicializar un objeto GenericPrincipal. Asociar el principal al hilo actual. [Visual C#] WindowsIdentity UnaIdentidad = WindowsIdentity.GetCurrent(); WindowsPrincipal UnPrincipal = new WindowsPrincipal(UnaIdentidad); [Visual Basic] Dim UnaIdentidad As WindowsIdentity = WindowsIdentity.GetCurrent() Dim UnPrincipal As New WindowsPrincipal(UnaIdentidad) [Visual C#] GenericIdentity UnaIdentidad = new GenericIdentity("Usuario"); String[] UnArray = {"Director", "Cajero"}; GenericPrincipal UnPrincipal = new GenericPrincipal(UnaIdentidad, UnArray); System.Threading.Thread.CurrentPrincipal = UnPrincipal; [Visual Basic] Dim UnaIdentidad As New GenericIdentity("Usuario") Dim UnArray() As String = {"Director", "Cajero"} Dim UnPrincipal As New GenericPrincipal(UnaIdentidad, UnArray) System.Threading.Thread.CurrentPrincipal = UnPrincipal
27. Seguridad Seguridad basada en roles - Controles de autentificación Se valida la identidad de un usuario comparando un String introducido por éste contra la propiedad Name de la propiedad Identity del Principal. [Visual C#] if (String.Compare(UnPrincipal.Identity.Name, "ibis.espepito", true)==0) { // Permite el acceso al código. } [Visual Basic] IfString.Compare(UnPrincipal.Identity.Name, " ibis.espepito ", True) = 0 Then ' Permite el acceso al código. End If
28. Seguridad Seguridad basada en roles – Rol específico de un Principal Se comprueba la membresía invocando al método IsInRole del objeto Principal. [Visual C#] if (UnPrincipal.IsInRole("BUILTINAdministradores")) { // Permite el acceso al codigo. } if (UnPrincipal.IsInRole(WindowsBuiltInRole.Administrator)) { // Permite el acceso al codigo. } [Visual Basic] If UnPrincipal.IsInRole("BUILTINdministradores") Then ' Permite el acceso al codigo. End If If UnPrincipal.IsInRole(WindowsBuiltInRole.Administrator) Then ' Permite el acceso al codigo. End If
29. Seguridad Seguridad basada en roles – Validación Se realizará utilizando la clase PrincipalPermission para comprobar identidad y membresía. [Visual C#] PrincipalPermission principalPerm = new PrincipalPermission("domainjo", "domainTeller", true); try { principalPerm.Demand(); // Tenía la autorización necesaria. } catch { // No tenía la autorización necesaria. } [Visual Basic] Dim principalPerm AsNew PrincipalPermission("domaino", _ "domaineller", True) Try principalPerm.Demand() ' Tenía la autorización necesaria. Catch ' No tenía la autorización necesaria. EndTry Creamos el objeto PrincipalPermission, iniciándolo con la identidad, rol y estatus de autentificación que debe cumplir. Invocamos el método Demand para saber si el usuario actual cumple los requisitos.
30. Seguridad Seguridad basada en roles – Validación También es posible efectuar esta operación declarativamente utilizando el atributo PrincipalPermissionAttribute al nivel de clase o método. [Visual C#] [PrincipalPermissionAttribute(SecurityAction.Demand, Name = "domainjo", Role = "domainTeller", Authenticated = true)] // Aquí vendrá la definición de clase o método... [Visual Basic] <PrincipalPermissionAttribute(SecurityAction.Demand, _ Name := "domaino", Role := "domaineller", Authenticated := True)> _ ' Aquí vendrá la definición de clase o método... Hemos de pasar el flagDemand como SecurityAction. Si omitimos cualquiera de los parámetros, equivaldrá a un comodín.
31. Seguridad Servicios criptográficos. ¿Qué es la Criptografía simétrica? ¿Cómo se utiliza? ¿Qué es la Criptografía asimétrica? ¿Cómo se utiliza? ¿Qué es una firma digital? Nuevas funcionalidades criptográficas en .NET Framework 3.5
32. Seguridad Servicios criptográficos - ¿Qué es la Criptografía simétrica? Es aquella que utiliza una clave secreta compartida para encriptar y desencriptar los datos. Datos Datos encriptados Datos Clave secreta Clave secreta Algoritmo simétrico Algoritmo simétrico El remitente encripta los datos confidenciales usando una clave secreta El receptor desencripta los datos confidenciales usando una clave secreta
33. Servicios criptográficos - ¿Cómo se utiliza? Se debe generar una clave simétrica. Hay que obtener una contraseña fuerte del usuario. Generar un salt, un número aleatorio criptográfico obtenido con el método GetBytes de la clase RandomNumberGenerator. Crear la clave con el método GetBytes de la clase Rfc2898DeriveBytes. Se encriptan los datos utilizando un algoritmo simétrico. Crear un objeto del algoritmo simétrico y un objeto stream. Escribir el salt y el vector de inicialización (generado por .NET) al stream, ambos sin encriptar para poder operar en la recepción. Escribir los datos encriptados en el stream. Mediante un objeto CryptoStream que arrope al FileStream. Se desencriptan utilizando el mismo algoritmo y la misma clave. [Visual C#] string password = ... ; // Obtener contraseña. // Validar la fuerza de la misma. Regex r = newRegex(@"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*)",RegexOptions.Singleline); if ((password.Length >= 9) && (r.IsMatch(password))) { // Genera un salt de 16 byte (128 bit). RandomNumberGenerator rNum = RandomNumberGenerator.Create(); byte[] salt = newbyte[16]; rNum.GetBytes(salt); // Genera una clave de 16 byte (128 bit). Rfc2898DeriveBytes derBytes = new Rfc2898DeriveBytes(password, salt); byte[] key = derBytes.GetBytes(16); } [Visual Basic] Dim password AsString = ... 'Obtener contraseña. 'Validar la fuerza de la misma. Dim r AsNew Regex("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*)", _ RegexOptions.Singleline) If (password.Length >= 9) AndAlso (r.IsMatch(password)) Then 'Genera un salt de 16 byte (128 bit). Dim rNum As RandomNumberGenerator = RandomNumberGenerator.Create() Dim salt(15) As Byte rNum.GetBytes(salt) 'Genera una clave de 16 byte (128 bit). Dim derBytes AsNew Rfc2898DeriveBytes(password, salt) Dim key() As Byte = derBytes.GetBytes(16) End If Seguridad [Visual C#] // Crea el objeto de algoritmo simétrico, con la clave anterior. Rijndael cryptoAlg = Rijndael.Create(); cryptoAlg.Key = key; // Crea el file stream, y escribe el salt y el vector. FileStream filestream = new FileStream(filename, FileMode.Create); filestream.Write(salt, 0, salt.Length); filestream.Write(cryptoAlg.IV, 0, cryptoAlg.IV.Length); // Crea el CryptoStream y encripta los datos. CryptoStream cryptostream = new CryptoStream(filestream, cryptoAlg.CreateEncryptor(), CryptoStreamMode.Write); cryptostream.Write(output, 0, output.Length); cryptostream.FlushFinalBlock(); cryptostream.Close(); [Visual Basic] ' Crea el objeto de algoritmo simétrico, con la clave anterior. Dim cryptoAlg As Rijndael = Rijndael.Create() cryptoAlg.Key = key ' Crea el file stream, y escribe el salt y el vector. Dim filestream As New FileStream(filename, FileMode.Create) filestream.Write(salt, 0, salt.Length) filestream.Write(cryptoAlg.IV, 0, cryptoAlg.IV.Length) ' Crea el CryptoStream y encripta los datos. Dim cryptostream As New CryptoStream(filestream, _ cryptoAlg.CreateEncryptor(), CryptoStreamMode.Write) cryptostream.Write(output, 0, output.Length) cryptostream.FlushFinalBlock() cryptostream.Close() [Visual C#] // Crea el objeto del algoritmo y el stream. Rijndael cryptoAlg = Rijndael.Create(); FileStream filestream = new FileStream(filename, FileMode.Open); // lee el salt y vector no encriptados del archivo. byte[] salt = new byte[16]; byte[] IV = new byte[cryptoAlg.IV.Length]; filestream.Read(salt, 0, salt.Length); filestream.Read(IV, 0, IV.Length); // Vuelve a generar la clave a partir de la contraseña y el salt y configura el algoritmo. Rfc2898DeriveBytes derBytes = new Rfc2898DeriveBytes(password, salt); byte[] key = derBytes.GetBytes(16); cryptoAlg.Key = key; cryptoAlg.IV = IV; // Crea el CryptoStream y lee los datos. CryptoStream cryptostream = new CryptoStream(filestream, cryptoAlg.CreateDecryptor(), CryptoStreamMode.Read); int bytesRead = 0; byte[] buffer = new byte[256]; do { bytesRead = cryptostream.Read(buffer, 0, 256); // Usar aquí los datos desencriptados del buffer. } while (bytesRead > 0); cryptostream.Close();
34. Seguridad Servicios criptográficos - ¿Qué es la Criptografía asimétrica? Aquella en la que las claves de encriptado y desencriptado son distintas (clave pública y clave privada). Los datos se encriptan con la clave pública del receptor y éste los desencripta con su clave privada. De esta forma no hay problema en transmitir la clave pública, ya que aunque se intercepte, no se podrán desencriptar los datos con ella. Lógicamente los algoritmos en encriptación asimétricos no son los mismos que los de encriptación simétrica. Aunque esta encriptación es bastante más pesada que la simétrica, motivo por el que, normalmente, se utiliza la encriptación asimétrica para intercambiar la clave pública y la encriptación simétrica para los datos a enviar.
35. Seguridad [Visual C#] public class StoreKey { public static void Main() { // Crea el objeto CspParameters e inicializa el contenedor del // nombre de la clave CspParameters cp = new CspParameters(); cp.KeyContainerName = "My RSA Key"; // Instancia el rsa acediendo al contenedor de la clave RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); // Escribe el par de claves Console.WriteLine("Key is : " + rsa.ToXmlString(true)); } } // Encripta usando la clave generada byte[] encryptedData = rsa.Encrypt(unencryptedData, false); [Visual Basic] Public Class StoreKey Public Shared Sub Main() ' Crea el objeto CspParameters e inicializa el contenedor del ' nombre de la clave Dim cp As New CspParameters() cp.KeyContainerName = "My RSA Key" ' Instancia el rsa acediendo al contenedor de la clave RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp Dim rsa As New RSACryptoServiceProvider(cp) ' Escribe el par de claves Console.WriteLine("Key is : " & rsa.ToXmlString(True)) End Sub End Class ' Encripta usando la clave generada Dim encryptedData As Byte() = rsa.Encrypt(unencryptedData, False)
36. Seguridad Servicios criptográficos - ¿Qué es una firma digital? Manifiestos ClickOnce Disponemos de nuevas clases que nos permiten acceder a los manifiestos firmados de los ensamblados desplegados con la tecnología ClickOnce. La clase ManifestSignatureInformation recupera la información de la firma del manifiesto cuando utilizamos el método VerifySignature. La enumeración ManifestKinds nos permite especificar el manifiesto a verificar, devolviendo un valor de la enumeración SignaruteVerificationResult. La clase ManifestSignatureInformationCollection nos devuelve una colección de objetos ManifestSignatureInformation de las firmas verificadas. Soporte para la suite B Disponemos de soporte para los siguientes algoritmos de la nueva suite de criptografía publicada por la National Security Agency (NSA). Advanced Encryption Standard (AES), claves de 128, 192 y 256 bits. Secure Hash Algorithms SHA-1, SHA-256, SHA-384 y SHA-512 para hashing. Elliptic Curve Digital Signature Algorithm (ECDSA), usando curvas de 256-bit, 384-bit y 521-bit módulos primos para firma. Este algoritmo está soportado por la clase ECDsaCng y permite firmar con una clave privada y verificar la firma con una clave pública. Elliptic Curve Diffie-Hellman (ECDH), usando curvas de 256-bit, 384-bit y 521-bit módulos primos para intercambio de claves y acuerdos de secreto, soportado por la clase ECDiffieHellmanCng. Wrappers para código manejado para las implementaciones certificadas del estándar Federal Information Processing Standard (FIPS), mediante las clases AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider y SHA512CryptoServiceProvider. Clases para la nueva generación de criptografía La cual nos permitirá una manipulación más sencilla de las claves, tanto públicas como los pares de claves pública/privada de la encriptación asimétrica, utilizando para referenciarlas un simple string.
37. Seguridad Nuevas funcionalidades criptográficas en .NET Framework 3.5 Es una forma de asegurarnos de que los datos recibidos no han sido alterados y nos permite identificar el remitente. El remitente codifica un hash de los datos y encripta el hash con una clave privada para generar la firma 1 Valor del Hash Algoritmo de Hash Algoritmo asimétrico Firma Data Clave privada del remitente El receptor desencripta la firma con la clave pública del remitente y compara el valor con el hash de los datos 2 Firma Algoritmo asimétrico ¿Son iguales los valores? Algoritmo de Hash Valor del Hash Firma des- encriptada Datos Clave pública del remitente