framework .net 3.5 11 seguridad

30
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.

Upload: antonio-palomares-sender

Post on 17-Jul-2015

1.407 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Framework .NET 3.5 11 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.

Page 2: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Arquitectura en .NETEn los sistemas operativos Windows, la seguridad y el control deacceso a los recursos del sistema están basados en la identificaciónde usuario.Una vez que el usuario se ha identificado en el sistema, todo elcódigo que ejecute tendrá acceso a todos los recursos que dichousuario tenga a su disposición.Esta es una "vulnerabilidad" habitualmente aprovechada por todotipo de código malicioso y hackers para hacerse con el control denuestras máquinas, ya que las solemos utilizar con usuarios contodos los privilegios..NET Framework añade una capa de seguridad a la del sistemaoperativo con los siguientes complementos:

Permisos de seguridad.Seguridad de tipos.Políticas de seguridad.Autentificación.Autorización.

Page 3: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Arquitectura en .NET.Permisos de seguridad:El CLR permitirá al código en ejecución efectuar sólo aquellas operacionesa 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 controlque efectúa el CLR antes de lanzar cualquier ejecución. Cuando unensamblado está marcado como type-safe, puede realizarse la ejecuciónen 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 porlos administradores del sistema y aplicadas por el CLR asegurando que elcódigo sólo pueda acceder a los recursos y lanzamiento de ejecuciones decódigo específicamente autorizados.

Autentificación:Asociada a la del sistema y a la seguridad basada en roles para permitir aun determinado usuario identificado el acceso a nuestro código.

Autorización:Implementada con la seguridad basada en roles, determina a qué puedetener acceso un determinado usuario o rol.

Page 4: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Espacios de nombres.

NameSpace Descripción

System.Security Suministra la estructura subyacente de seguridad del Common Language Runtime

System.Security.AccessControl Suministra clases, delegados y enumeraciones que permiten controlar el acceso y auditan acciones relacionadas con la seguridad de objetos.

System.Security-Authentication Suministra un conjunto de enumeraciones que describen la seguridad de una conexión.

System.Security.Cryptography Suministra servicios criptográficos para codificar y descodificar datos y operaciones como generación de HASH o números aleatorios y autentificación de mensajes.

System.Security.Permissions Define clases que controlan el acceso a operaciones y recursos basándose en políticas.

System.Security.Policy Define clases, interfaces y enumeraciones relacionadas con grupos de código, condiciones de membresía y evidencias.

System.Security.Principal Define clases, interfaces y enumeraciones relacionadas con el contexto de seguridad bajo el cual esté corriendo el código.

Page 5: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Guías de diseñoValidació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ónUtilizar contraseñas fuertes, con la ayuda de expresiones reglares sonfáciles de validar.Establecer una política de caducidad de contraseñas y desactivación decuentas.No almacenar JAMÁS las contraseñas como texto plano, Es mejoralmacenar un hash y recalcularlo con la entrada del usuario.Encriptar los canales de comunicaciones, para proteger los tokens deseguridad, evitando que con la captura de una cookie se pueda ganaracceso a nuestro sistema.

AutorizaciónUtilizar siempre cuentas con privilegios bajos, para proteger el acceso alos recursos.Restringir el acceso a los recursos del sistema: archivos, carpetas,claves de registro, objetos de Active Directory, objetos de base de datosy registro de eventos.

Page 6: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Guías de diseñoGestión de configuración:

Añadir sistemas de seguridad a los interfaces de administración paraque sólo puede acceder personal autorizado.No almacenar las configuraciones de seguridad en archivos o, al menos,encriptar esas secciones.

CriptografíaNo desarrollar criptografías personalizadas, por la dificultad de hacerloadecuadamente, 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 datosencriptados dejarán de estar seguros.

Sensibilidad de los datos:Gestione los datos secretos con mucho cuidado, no los almacene jamáscomo texto plano en el código, siempre se puede extraer, encriptelos sino puede evitar su inserción en el código.Maneje la información sensible de usuario cuidadosamente, datos deconexión, códigos de cuenta, tarjetas, … deberán ser solicitadas en elmomento adecuado, pero no almacenadas como variables de entorno enmemoria.

Page 7: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Modelos de amenazasEn un sistema de Threat modelling evaluaremos y clasificaremoscontinua y cíclicamente las potenciales amenazas a nuestro sistemay seleccionaremos la técnicas paliativas adecuadas, ya que no sepuede proteger un sistema frente a los ataques si no se comprendenestos y su alcance.El modelo STRIDE representa las 6 categorías de amenazas quenuestro sistema deberá afrontar:

(Spoofing identity) Impersonación frente al sistema o usurpaciónde identidad.(Tampering with data) Modificación maliciosa de datos persistidoso en tránsito.(Repudiation) Negación de responsabilidad (yo no he sido).(Information disclosure) Acceso a información reservada porusuario no autorizados.(Denial of service(DoS)) Denegación de servicio por la sobrecargadel servidor o sistema de validación.(Elevation of privilege) Incremento de los privilegios, accediendo atodo el sistema.

Page 8: Framework .NET 3.5 11 Seguridad

Principios de seguridad – Implementar STRIDEEl 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 nuestrosistema.

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 mitigarcada amenaza.

Vuelve a empezar por el primer paso a medida que elproyecto evolucione, ya que nunca se tiene la imagencompleta y todos los hechos al principio de un proyecto yrealizar una única pasada puede dejar agujeros devulnerabilidad a los ataques.

Page 9: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código.Nos permite proteger el ordenador frente a ataques de códigomóvil. Como permitir al código de origen desconocidoejecutarse en un entorno protegido y como evitar que elcódigo marcado como seguro pueda comprometer, voluntariao 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

Page 10: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código – Building blocks.La seguridad del sistema operativo permite evitar que losusuario no autorizados tengan acceso al sistema, pero nopuede evitar que los usuarios validados descarguen yejecuten código malicioso..NET Framework nos suministra la seguridad de acceso delcódigo para proteger al sistema del código malicioso, peropermitir al código móvil ejecutarse de forma segura.Matizando el nivel de confianza basándose en factores cómoel origen y publicador del código.Y especificando la petición de determinado nivel de privilegiosde seguridad al sistema operativo:

El nivel de privilegios requeridos para ejecutarse.El nivel de privilegios que pueden utilizarse pero norequeridos para ejecutarse.El nivel de privilegios no requeridos y que deben serexplícitamente excluidos.

Page 11: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código - Evidencias.Son la denominación de la identificación de la identidad yorigen del ensamblado.La información incluida en la evidencia que identifica unensamblado 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 origende un ensamblado es, de mayor a menor seguridad :

El publicador del ensamblado, validado con su firmaauthenticode.

La zona en la que se originó el ensamblado: ordenadorlocal, Intranet o Internet.

La ubicación de origen del ensamblado: URL, UNC, path ocarpeta local del sistema.

Page 12: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código – Nombres seguros.Los Strong Names aseguran que un ensamblado tenga unidentificador global único, que luego será usado por el CLRpara especificar los permisos requeridos por el ensambladopara ejecutarse correctamente.Un nombre seguro utiliza criptografía de clave pública paraasignar el identificador único y una firma digital para asegurarla 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 laherramienta Sn.exe del SDK o firmando en la pestaña firmade las propiedades del proyecto.Firmar el ensamblado con un nombre seguro usando el parde claves.

Page 13: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código – Permissions setsLas políticas del CAS controlan los otorgados al código paraacceder a los recursos, basándose en la identidad y origen,asociando un tipo de evidencia con un conjunto de permisos.

Conjunto Descripción

Nothing El código no se puede ejecutar

Execution Se puede ejecutar pero no puede acceder a los recursos protegidos

Internet Se puede ejecutar, puede crear ventanas de primer nivel, cuadros de diálogo de archivos, conexiones Web al mismo sitio desde el que originó el ensamblado y utilizar almacenamiento aislado con cuotas.

LocalIntranet Se puede ejecutar, puede crear elementos de interfaz de usuario sin limitaciones, usar almacenamiento aislado sin cuotas, usar servicios DNS, leer variables de entorno de USERNAME, TEMP y TMP, crear conexiones Web al mismo sitio que el original del ensamblado y leer archivos en la carpeta del ensamblado.

Everything Todos los permisos estándar, excepto saltarse la verificación.

FullTrust Acceso completo a todos los recursos.

Custom-Defined Definido por el usuario.

Para ver estas políticas habremos de usar:• .NET Framework Configuration tool. Es un snap-in de

MMC que nos da un interfaz grafico para acceder a las políticas de seguridad. Requiere la instalación del Framework 2.0 SDK ya que la instalación de VS 2008 no instala esta herramienta.

• 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

Page 14: Framework .NET 3.5 11 Seguridad

Seguridad de acceso de código – Code groups.Un grupo de código relaciona un tipo de evidencia a un conjunto depermisos.

Site = Adatum.comAll Printer Access

Publisher=MicrosoftRead:C:\Microsoft

Zone=InternetInternet

Zone=MyComputerExecution

SN Key=25 98…Read:C:\Adatum

SN Key = 9F AD…Name = Microsoft MoneyRead:C:\Money

SN Key = 9F AD…Name = Microsoft.AppWrite:C:\Microsoft

All CodeNothing

Permission GrantEvidence

Una jerarquía de code groups

Publisher = AdatumSite = Adatum.comSN Key=25 98…

Execution Read:C:\Adatum All Printer Access

Publisher = MicrosoftZone= InternetSNKey = 9F AD…

Read C:\Microsoft Read C:\Money Write: C:\Microsoft Internet

Page 15: Framework .NET 3.5 11 Seguridad

Formato general petición permisos:

[C#][assembly: permission-name(SecurityAction.security-action-value, parameters)]

[VB]<Assembly: permission-name(SecurityAction.security-action-value, parameters)>

Seguridad de acceso de código – Petición de permisos.Es la forma que tenemos de indicarle al CLR, dentro del propiocódigo, que necesidades específicas de permisos se requieren en unmomento dado, tanto para reclamar como para denegar, inclusoaunque las políticas de seguridad otorguen el permiso.Para ello habremos de utilizar las clases específicas definidas en .NETFramework, todas ellas heredando de CodeAccessPermision, lacual nos provee de los métodos Demand, Assert, Deny, PermitOnly,IsSubsetOf, Intersect y Union.

Valor seguridad Descripción

RequestMinimum Requisitos mínimos para la ejecución

RequestOptionalPermisos adicionales, opcionales aunque no requeridos para poder ejecutarse. Implícitamente deniega el resto de permisos.

RequestRefuse Permisos a no otorgar al código, aunque la política de seguridad los permita.

Clase Recurso protegido

AspNetHostingPermission Recursos de entornos alojados en ASP.NET

DirectoryServicesPermission Servicios de directorio

EnvironmentPermission Variables de entorno

EventLogPermission Event logs

FileDialogPermission Cuadros de diálogo de archivos de la interfaz de usuario

FileIOPermission Archivos y carpetas del sistema de archivos

OdbcPermission Bases de datos accedidas mediante ODBC

OleDbPermission Bases de datos accedidas mediante OLE DB

PrintingPermission Impresoras

RegistryPermission Variables del registro

SecurityPermissionEjecutar código, permisos assert, llamadas a código no manejado, saltarse la verificación y otros permisos

SqlClientPermission Bases de datos accedidas mediante SQL Server

UIPermission Ventanas y otros elementos de la interfaz de usuario

WebPermission Conexiones a otros ordenadores mediante HTTP

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

Page 16: Framework .NET 3.5 11 Seguridad

Seguridad basada en roles.

Es la técnica utilizada para otorgar o denegar permiso deacceso 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.

Page 17: Framework .NET 3.5 11 Seguridad

Seguridad basada en roles - ¿Qué es una identidad?

Es un objeto que encapsula la información sobre el usuario o entidadque está siendo validado, como el nombre de usuario y el tipo deautentificación, definido en el espacio de nombresSystem.Security.Principal .

Los tipos de identidad en .NET Framework son:

Windows: la de acceso al ordenador, impersonable, claseWindowsIdentity.

Genérica: Usando un método de identificación personalizadodefinido por la aplicación, clase GenericIdentity.

Personalizada: Clase nuestra, implementando el interfaz.

Todas las clases de identidad implementan el interfaz IIdentity, conlas propiedades:

Nombre: el del usuario actual, de tipo String.

IsAuthenticated: Booleano, identificado o no.

AuthenticationType: String indicando el tipo de autentificación.

Page 18: Framework .NET 3.5 11 Seguridad

Seguridad basada en roles - ¿Qué es un Security Principal?

Es un objeto que representa el contexto de seguridad bajo el queestá corriendo el código, con su identidad y sus roles , definido en elespacio 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), claseWindowsPrincipal.

Generic principal: usuarios y roles que existenindependientemente de los del sistema y sus roles. Para losmé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, conlas propiedades:

Identity: recupera el objeto identidad asociado al usuario actual.

IsInRole: determina si el usuario actual está en un rol o no.

Page 19: Framework .NET 3.5 11 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#]

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

[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)

Page 20: Framework .NET 3.5 11 Seguridad

[Visual C#]

if (String.Compare(UnPrincipal.Identity.Name, "ibis.es\\pepito",

true)==0)

{

// Permite el acceso al código.

}

[Visual Basic]

If String.Compare(UnPrincipal.Identity.Name, " ibis.es\\pepito ",

True) = 0 Then

' Permite el acceso al código.

End If

Seguridad basada en roles - Controles de autentificación

Se valida la identidad de un usuario comparando un Stringintroducido por éste contra la propiedad Name de la propiedadIdentity del Principal.

Page 21: Framework .NET 3.5 11 Seguridad

[Visual C#]

if (UnPrincipal.IsInRole("BUILTIN\\Administradores"))

{

// Permite el acceso al codigo.

}

if (UnPrincipal.IsInRole(WindowsBuiltInRole.Administrator))

{

// Permite el acceso al codigo. }

[Visual Basic]

If UnPrincipal.IsInRole("BUILTIN\Administradores") Then

' Permite el acceso al codigo.

End If

If UnPrincipal.IsInRole(WindowsBuiltInRole.Administrator) Then

' Permite el acceso al codigo.

End If

Seguridad basada en roles – Rol específico de un Principal

Se comprueba la membresía invocando al método IsInRole delobjeto Principal.

Page 22: Framework .NET 3.5 11 Seguridad

[Visual C#]

PrincipalPermission principalPerm = new PrincipalPermission("domain\\jo",

"domain\\Teller", true);

try

{

principalPerm.Demand();

// Tenía la autorización necesaria.

}

catch

{

// No tenía la autorización necesaria.

}

[Visual Basic]

Dim principalPerm As New PrincipalPermission("domain\jo", _

"domain\Teller", True)

Try

principalPerm.Demand()

' Tenía la autorización necesaria.

Catch

' No tenía la autorización necesaria.

End Try

Seguridad basada en roles – Validación

Se realizará utilizando la clase PrincipalPermission para comprobaridentidad y membresía.

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.

Page 23: Framework .NET 3.5 11 Seguridad

[Visual C#]

[PrincipalPermissionAttribute(SecurityAction.Demand, Name = "domain\\jo",

Role = "domain\\Teller", Authenticated = true)]

// Aquí vendrá la definición de clase o método...

[Visual Basic]

<PrincipalPermissionAttribute(SecurityAction.Demand, _

Name := "domain\jo", Role := "domain\Teller", Authenticated := True)> _

' Aquí vendrá la definición de clase o método...

Seguridad basada en roles – Validación

También es posible efectuar esta operación declarativamente utilizando elatributo PrincipalPermissionAttribute al nivel de clase o método.

Hemos de pasar el flag Demand como SecurityAction.

Si omitimos cualquiera de los parámetros, equivaldrá a un comodín.

Page 24: Framework .NET 3.5 11 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 Framework3.5

Page 25: Framework .NET 3.5 11 Seguridad

Servicios criptográficos - ¿Qué es la Criptografía simétrica?

Es aquella que utiliza una clave secreta compartida paraencriptar y desencriptar los datos.

Datos Datos encriptados Datos

Algoritmo simétrico

Algoritmo simétrico

Clave secreta

Clave secreta

El remitente encripta los datos confidenciales usando una clave secreta

El receptor desencripta los datos confidenciales usando una clave secreta

Algoritmo Tamaño claves Commentarios

Data Encryption Standard (DES)

64 bitsEffective key size is 56 bits. No longer considered secure for long-lived data

TripleDES 128., 192 bits Effective key sizes are 112 bits and 168 bits

RC2 40 to 128 bits

Rijndael / Advanced Encryption Standard (AES)

128, 192, 256 bitsWinner of the U.S. Government’s AES contest as the replacement for DES

Page 26: Framework .NET 3.5 11 Seguridad

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 elmétodo GetBytes de la clase RandomNumberGenerator.

Crear la clave con el método GetBytes de la claseRfc2898DeriveBytes.

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) alstream, ambos sin encriptar para poder operar en la recepción.

Escribir los datos encriptados en el stream. Mediante un objetoCryptoStream 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 = new Regex(@"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-

Z])(?=.*\W)",RegexOptions.Singleline);

if ((password.Length >= 9) && (r.IsMatch(password)))

{

// Genera un salt de 16 byte (128 bit).

RandomNumberGenerator rNum = RandomNumberGenerator.Create();

byte[] salt = new byte[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 As String = ... ' Obtener contraseña.

' Validar la fuerza de la misma.

Dim r As New Regex("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)", _

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 As New Rfc2898DeriveBytes(password, salt)

Dim key() As Byte = derBytes.GetBytes(16)

End If

[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();

Page 27: Framework .NET 3.5 11 Seguridad

Servicios criptográficos - ¿Qué es la Criptografía asimétrica?Aquella en la que las claves de encriptado y desencriptado sondistintas (clave pública y clave privada).Los datos se encriptan con la clave pública del receptor y éste losdesencripta con su clave privada.De esta forma no hay problema en transmitir la clave pública, yaque aunque se intercepte, no se podrán desencriptar los datos conella.Lógicamente los algoritmos en encriptación asimétricos no son losmismos 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étricapara intercambiar la clave pública y la encriptación simétrica para losdatos a enviar.

Algoritmo Tamaño claves Comentarios

Rivest, Shamir, and Adelman (RSA)

384 to 16384 bits, in 8-bit increments

Can be used to encrypt data and generate digital signatures

Digital Signature Algorithm (DSA)

512 to 1024 bits, in 64-bit increments

Can be used only to generate digital signatures

Page 28: Framework .NET 3.5 11 Seguridad

[Visual C#]public class StoreKey {

public static void Main() {// Crea el objeto CspParameters e inicializa el contenedor del// nombre de la claveCspParameters cp = new CspParameters();cp.KeyContainerName = "My RSA Key";// Instancia el rsa acediendo al contenedor de la claveRSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);// Escribe el par de clavesConsole.WriteLine("Key is : \n" + rsa.ToXmlString(true));

}}// Encripta usando la clave generadabyte[] 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 claveDim cp As New CspParameters()cp.KeyContainerName = "My RSA Key"' Instancia el rsa acediendo al contenedor de la claveRSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp

Dim rsa As New RSACryptoServiceProvider(cp)' Escribe el par de clavesConsole.WriteLine("Key is : " & rsa.ToXmlString(True))

End SubEnd Class' Encripta usando la clave generadaDim encryptedData As Byte() = rsa.Encrypt(unencryptedData, False)

Page 29: Framework .NET 3.5 11 Seguridad

Servicios criptográficos - ¿Qué es una firma digital?Manifiestos ClickOnceDisponemos de nuevas clases que nos permiten acceder a los manifiestosfirmados de los ensamblados desplegados con la tecnología ClickOnce.

La clase ManifestSignatureInformation recupera la información de la firma delmanifiesto 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 deobjetos ManifestSignatureInformation de las firmas verificadas.

Soporte para la suite BDisponemos de soporte para los siguientes algoritmos de la nueva suite decriptografí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 y521-bit módulos primos para firma. Este algoritmo está soportado por la clase ECDsaCngy 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-bitmódulos primos para intercambio de claves y acuerdos de secreto, soportado por la claseECDiffieHellmanCng.Wrappers para código manejado para las implementaciones certificadas del estándarFederal Information Processing Standard (FIPS), mediante las clasesAesCryptoServiceProvider, SHA256CryptoServiceProvider,SHA384CryptoServiceProvider y SHA512CryptoServiceProvider.

Clases para la nueva generación de criptografíaLa cual nos permitirá una manipulación más sencilla de las claves, tanto públicascomo los pares de claves pública/privada de la encriptación asimétrica,utilizando para referenciarlas un simple string.

Page 30: Framework .NET 3.5 11 Seguridad

Nuevas funcionalidades criptográficas en .NET Framework 3.5

Es una forma de asegurarnos de que los datos recibidos no han sidoalterados y nos permite identificar el remitente.

El receptor desencripta la firma con la clave pública del remitente y compara el valor con el hash de los datos2

Firma

DatosAlgoritmode Hash

Algoritmo asimétrico

Valor del

Hash Clave pública del remitente

Firma des-encriptada

¿Son iguales los valores?

FirmaDataAlgoritmo de Hash Clave privada del

remitente

Algoritmo asimétrico

Valor del Hash

El remitente codifica un hash de los datos y encripta el hash con una clave privada para generar la firma1