Resumen Examen MCTS 70-536 – Autenticación y Autorización

 http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&locale=en-us

Este es otro de los resúmenes que he rescatado. Va de la gestión de la seguridad en el .net Framework.

Como curiosidad, indicar que en la RAE sólo existe el término Autenticación, y no Autentificación. Se define autenticación como la acción y el efecto de autenticar, y autenticar es "autorizar o legalizar algo", o bien "dar fe de la verdad de un hecho o documento con autoridad legal" (fuente: diccionario online de la RAE). Creo que conocer el significado de las palabras es importante para aclarar nuestras ideas y trasmitirlas con fidelidad a nuestros pensamientos. Por eso me detengo en estos detalles.

Obs de último momento: Están admitidos tanto el verbo autenticar como autentificar. Ambos términos tienen el mismo significado. Ver + info aquí.

Bueno… a lo que íbamos.

En la jerga informática, que es la que nos interesa…

Autenticación: Es el proceso de identificación de un usuario.

Autorización: Es proceso por el que permite o deniega el acceso de un usuario a un recurso.

La clase System.Security.Principal.WindowsIdentity representa un usuario de Windows. No permite autenticar a un usuario; solo guarda el resultado de la autenticación. Estos son sus métodos más importantes:

GetAnonymous (shared)

Devuelve un objeto WindowsIdentity que representa a un usuario anónimo.

GetCurrent (shared)

Devuelve un objeto WindowsIdentity que representa el usuario actual de Windows.

Impersonate (shared)

Devuelve un objeto WindowsImpersonationContext que representa un usuario concreto del sistema. Permite al código que se está ejecutando reemplazar a otro usuario de Windows.

GetCurrent

Devuelve el objeto WindowsPrincipal correspondiente al usuario.

Estas son propiedades (no estáticas) de WindowsIdentity

AuthenticationType

String que indica el método de autenticación. Generalmente "NTLM".

IsAnonymous

bool que indica si el usuario es anónimo.

IsAuthenticated

bool que indica si el usuario ha sido autenticado.

IsGuest

bool que indica si el usuario es un usuario "guest" o invitado.

IsSystem

bool que indica si el usuario es un usuario de sistema.

Name

string con el nombre de usuario y el dominio en el que ha sido autenticado. Si posee una barra invertida () dentro del nombre, indica que el usuario ha si do autenticado por un dominio de Active Directory. En caso contrario la autenticación se produjo contra el equipo local.

Token

int con el token identificador del usuario.

La clase WindowsPrincipal proporciona acceso a los grupos de los que un usuario es miembro. Esta clase debe ser creada pasando como parámetro de su constructor una instancia de WindowsIdentity, o bien llamando  al método GetCurrent() de WindowsIdentity. Estos son algunos de sus métodos:

IsInRole

bool que indica si el usuario es miembro del grupo especificado.

Las clases PrincipalPermission y PrincipalPermissionAttribute permiten, en conjunto, saber si el usuario cumple o no unos criterios de autorización determinados.

Estas son las propiedades de PrincipalPermission

Authenticated

bool que en caso de ser true, indica que el usuario debe estar autenticado para poseer la autorización.

Name

string que indica el nombre que debe tener el usuario para poseer la autorización.

Role

string que indica el nombre del grupo al que debe pertenecer el usuario para poseer la autorización.


Métodos
de PrincipalPermission

Demand

Comprueba que el usuario cumpla con los criterios de Authenticated, Name y Role especificados en sus propiedades. En caso contrario, se lanza una SecurityException.

   


Seguridad Declarativa (Declarative RBS Demands)
: Indica al runtime, mediante atributos, que realize comprobaciones Role-Based Security (Seguridad basada en Roles) antes de ejecutar el código de un ensamblado, clase o método.

Usar este tipo de atributos es la manera más segura de impedir la ejecución de código a usuarios no autorizados, aunque posee algunos inconvenientes.

Para usar estos atributos, es no olvidar realizar los siguientes pasos:

– Realizar una llamada a System.AppDomain.CurrentDomain.SetPrincipalPolicy indicando la política de seguridad para el IPrincipal (usuario) que ejecutará nuestro código.
– Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una SecurityException.
– Los atributos PrincipalPermission para declarar los accesos requeridos al ensamblado, clase o método cuyo acceso se desee restringir.

Seguridad Imperativa
Las validaciones usadas en la seguridad imperativa se realizan dentro del código y eliminan la limitación de la seguridad declarativa de restringir los accesos a grandes porciones de código.

Los pasos para incluir la seguridad imperativa en el código son los siguientes:
– Realizar una llamada a System.AppDomain.CurrentDomain.SetPrincipalPolicy indicando la política de seguridad para el IPrincipal (usuario) que ejecutará nuestro código.
– Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una SecurityException.
– Un objeto PrincipalPermission para especificar las restricciones que aplicarán al código.
– Una llamada a PrincipalPermission.Demand() para verificar que el IPrincipal especificado está autorizado.

La clase PrincipalPermission posee 3 constructores:

– PrincipalPermission(PermissionState): el enum PermissionState indica si la política de autorización es restrictiva o permisiva, es decir, si de primeras  no autorizamos al recurso a menos que cumpla el resto de requisitos, o si de primeras autorizamos al recurso, a menos que cumpla los requisitos.
– PrincipalPermission(Name, Role): Especifica como requisitos de autorización un nombre de usuario y un rol determinado.
– PrincipalPermission(Name, Role, Authenticated) Especifica como requisitos de autorización un nombre de usuario, un rol y un estado de autorización determinados.

Implementando usuarios y roles(grupos) propios
Para realizar esta tarea es necesario implementar las interfaces System.Security.Principal.IIdentity y System.Security.Principal.IPrincipal. Estas interfaces permiten utilizar la infraestructura de acceso y autenticación de la plataforma. De hecho, las clases WindowsIdentity y WindowsPrincipal las implementan. De igual modo, en asp.net existen la clase FormsIdentity y PassportIdentity que también son implementaciones de estas intefaces.
Con lo cual, para implementar nuestro propio motor de autenticación y gestión de grupos y usuario, tirando por ejemplo, contra una base de datos, debemos, bien heredar de alguna de las clases vistas anteriormente o implementar estas interfaces.

Propiedades de IIdentity

AuthenticationType

string para determinar el tipo de autenticación a usar. Para usar el de windows, NTLM.

IsAuthenticated

booleano que indica si el proceso de autenticación ha sido válido.

Name

string con el nombre de usuario.

Métodos de IPrincipal

Identity

Objeto IIdentity que determina la identidad del usuario

IsInRole

bool que indica si el Identity pertenece al grupo o rol especificados.

La excepción System.Security.Authentication.AuthenticationException se lanza cuando se produce un error de autenticación.

La excepción System.Security.Authentication.InvalidCredentialException se lanza cuando el sistema ha denegado nuestra autenticación y no podemos volver a intentar autenticarnos.

Crossposted from crisfervil.com

Windows Presentation Foundation bloqueado en Firefox – Sucesión de despropósitos

Nada más abrir el Firefox…

image 

Este es el plug-in que permite ver aplicaciones x-bap en Firefox

Venga, le doy a ver más información… pero no se reconoce a sí mismo…

image

 

 

 

image

https://bugzilla.mozilla.org/show_bug.cgi?id=522777

http://blogs.technet.com/srd/archive/2009/10/12/ms09-054.aspx

Por lo visto el bloqueo es debido a una vulnerabilidad en aplicaciones x-Bap que puede ser explotada usando este complemento para Firefox. La vulnerabilidad permite saltarse las protecciones del SandBox en el que se ejecutan este tipo de aplicaciones. No he encontrado detalles más concretos acerca de cómo explotar esta vulnerabilidad.

Crossposted from crisfervil.com

Nene no gustar

Así no progresamos…

De acuerdo, hay un error en la escritura, pero uno me lo resuelve, y el otro no.

Pequeños detalles que hacen que me siga costando tenerlo como buscador por defecto.

image

image 

Venga.. vale… vamos a colaborar….

image

Crossposting from crisfervil.com

Resumen Examen MCTS 70-536 – Criptografía

Este es un resumen que hice en su día de los temas de criptografía para el examen de certificación. Lo pongo por aquí porque sigue siendo válido y por si a alguno le puede interesar.

Aquí encontraréis un resumen parecido elaborado por mi amigo Valeriano.

Criptografía Simétrica
Es el mecanismo de encriptación mediante el cual se pueden encriptar o desencriptar datos utilizando una clave secreta que debe ser conocida por el codificador y el decodificador del mensaje.

Criptografía Asimétrica
Es el mecanismo que permite encriptar o desencriptar datos mediante un par de claves, una privada, conocida solo por el codificador y otra pública, conocida por el decodificador.
La criptografía asimétrica, elimina el problema de la transmisión de la clave secreta entre el codificador y el decodificador del mensaje.

Usando la criptografía Simétrica con .net Framework
Las clases que proporcionan servicios de criptografía se encuentran agrupados en el espacio de nombres System.Security.Cryptography.
Se proporcionan 4 algoritmos para trabajar con criptografía simétrica:

Algoritmo

Longitud Máxima de la Clave

Descripción

RijndaelManaged

de 128 a 256 Bits, en incrementos de a 32 Bits

Es un estándar de encriptación del gobierno estadounidense. Cabe resaltar simplemente que a diferencia de los demás algoritmos, la clase está íntegramente implementada sobre código administrado.

DES

56 bits

Es un algoritmo de encriptación simétrico que utiliza claves relativamente cortas, con lo cual es vulnerable a ataques. Por esto, no debería ser utilizado.

RC2

Variable

Algoritmo surgido para solventar el problema de encriptación de claves cortas de DES.

TripleDES

156 bits, de los cuales son efectivos únicamente 112

Básicamente consiste en pasar el DES 3 veces.

Vector de Inicialización (IV): Es un valor utilizado por el algoritmo de encriptación simétrico para "oscurecer" el primer bloque de datos encriptados, lo que aumenta la dificultad de obtener un acceso no autorizado al mensaje.

Las clases utilizadas para trabajar con algoritmos simétricos derivan de System.Security.Cryptography.SymmetricAlgorithm, y exponen las siguientes propiedades y métodos:

Propiedades

 

BlockSize

Obtiene o establece el número de Bits (ojo, Bits no Bytes) que el algoritmo puede procesar en cada vuelta.
Esta es una propiedad que generalmente no suele ser utilizada por el programador.

FeedBackSize

Obtiene o establece el FeedBackSize de la operación. Igual que la anterior, puede ser ignorada.

IV

Obtiene o establece el array de bytes utilizado como vector de inicialización del algoritmo.

Key

Obtiene o establece el array de bytes utilizado como clave por el algoritmo simétrico.

KeySize

Obtiene o establece el tamaño en bits de la clave utilizada.

LegalBlockSizes

Array de KeySizes que contiene los tamaños de clave admitidos por el algoritmo.

LegalKeySizes

Array de KeySizes que contiene los tamaños de clave admitidos por el algoritmo.

Mode

Define uno de los aspectos del algoritmo de encriptación. Es uno de los valores definidos en la Enum CypherMode.

Métodos

 

CreateDecryptor

Crea el objeto ICryptoTransform que el objeto  CryptoStream necesita para Desencriptar datos.

CreateEncryptor

Crea el objeto ICryptoTransform que el objeto CryptoStream necesita para Encriptar datos.

GenerateIV

Genera aleatoriamente un vector de inicialización para usar con el algoritmo.

GenerateKey

Genera aleatoriamente una clave para usar con el algoritmo.

ValidKeySize

Devuelve un bool que indica si el tamaño de la clase especificada en la propiedad Key es válido para ser utilizado con el algoritmo. Muy útil si trabajamos sin conocer exactamente qué algoritmo vamos a usar.

Creando una clave simétrica
Podemos crear una clave simétrica y un vector de inicialización a partir de una contraseña definida por el usuario mediante la clase Rfc2898DeriveBytes. Además de la contraseña del usuario, necesitaremos un valor de salto, que debe ser conocido por el codificador y el decodificador del mensaje.
Al constructor de la clase Rfc2898DeriveBytes pasaremos la clave definida por el usuario y el valor de salto, codificado en un array de bytes. Posteriormente obtendremos la clave y el vector de inicialización generados mediante el método GetBytes. A este método, debemos indicar en bytes, la longitud de la clave y el vector que necesitamos obtener.

Pasos para realizar operaciones de cifrado/descifrado
1- Crear el objeto SymmetricAlgorithm que contendrá la infraestructura relativa al algoritmo que vayamos a usar.
2- Especificar la clave simétrica y el IV o ambos.
3- Crear el objeto ICryptoTransform, llamando a SymmetricAlgorithm.CreateEncryptor() o SymmetricAlgorithm.CreateDecryptor() según la operación que vayamos a realizar.
4- Crear un objeto Stream, en que hará de origen o destino de los datos.
5- Crear un obeto CryptoStream unsando el Stream de datos que creamos en el paso 4 y el ICryptoTransform del paso 3.
6- Leer o Escribir en el CryptoStream como si fuera un Stream corriente.

Ejemplo:
Crearemos un WinForm en el que agregaremos los siguientes controles:
– Un ComboBox cmbAlgorithm que contendrá la lista de algoritmos disponibles.
– Un TextBox txtKey que contendrá la clave a utilizar para cifrar/descifrar.
– Un TextBox txtText que contendrá el texto sobre el que realizaremos la operación y en que mostraremos los resultados.
– Un Button btnEncrypt que lanzará el proceso de encriptación.
– Un Button btnDecrypt que lanzará el proceso de desencriptación.

Crearemos primeramente una función que nos devuelva el valor en el formato correcto para asignar a la Key o al IV.

image

Posteriormente, creamos esta función que nos permitirá encriptar o desencriptar según el parámetro

image

Finalmente, llamamos a la función en el Click de los botones

image

Criptografía Asimétrica

Algoritmos proporcionados por la plataforma: El algoritmo RSA y el DSA y las clases que lo implementan son RSACryptoServiceProvider y DSACryptoServiceProvider, respectivamente. Ambas implementaciones son una mera fachada del api de Windows que proporciona esta funcionalidad, y se ejecutan en código no administrado.

Al igual que los algoritmos simétricos, las clases que permiten implementar estos algoritmos derivan de System.Security.Cryptography.AsymmetricAlgorithm.  Esta clase expone las siguientes propiedades:

Propiedades

 

KeyExchangeAlgorithm

Devuelve el nombre del algoritmo que se está utilizando.

KeySize

Devuelve el tamaño en bits de las claves utilizadas.

LegalKeySizes

Array con los tamaños de claves permitidos por el algoritmo.

SignatureAlgorithm

Devuelve la URL de un documento XML que describe la firma del algoritmo.

PersistKeyInCsp

Devuelve o establece un bool que indica si la clave se almacenará en el CSP (Crypto Service Provider).

UseMachineKeyStore

Obtiene o establece un valor que indica si la clave debe conservarse en el almacén de claves del equipo en lugar del almacén de perfiles de usuario.

Métodos expuestos por la clase RSACryptoServiceProvider

Decrypt

Desencripta datos encriptados con el algoritmo RSA

Encrypt

Encripta datos usando el algoritmo RSA

ExportParameters

Devuelve una estructura RSAParameters que representa los parámetros estándar (las claves privada/pública) para el algoritmo RSA. Admite un parámetro booleano que en caso de ser false incluye en la estructura únicamente la clave pública.

FromXmlString

Importa el par de claves a partir de la cadena xml suministrada.

ImportParameters

Carga el par de claves a partir de la estructura RSAParameters suministrada.

SignData

Calcula el valor hash de la matriz de bytes especificada mediante el algoritmo hash proporcionado y firma el valor hash resultante.

SignHash

Calcula la firma del valor hash especificado cifrándolo con la clave privada.

VerifyData

Verifica la firma especificada comparándola con el resultado de calcular la firma de los datos especificados.

VerifyHash

Verifica el valor hash especificado comparándola con el resultado de calcular el valor Hash para los datos especificados.

 

¿Cómo Importar y Exportar o persistir claves asimétricas?
Para exportar la claves de un algoritmo RSA, podemos recurrir al método ExportParameters de la clase RSACryptoServiceProvider, especificando en el único parámetro booleano admitido, si deseamos exportar tabién la clave privada. Este método nos devolverá una estructura RSAParameters que podemos convertir fácilmente a un array de bytes y transmitir o almacenar donde queramos.

Adicionalmente, la clase AsymmetricAlgorithm expone el método ToXmlString(), que podemos usar igualmente junto con FromXmlString() para realizar tareas de importación/exportación de claves.

También es posible abstraerse del medio de persistencia utilizando el almacenamiento proporcionado por el CSP (Crypto Service Provider). Para esto recurriremos al constructor de la clase RSACryptoServiceProvider que admite un parámetro de tipo CspParameters, pasándole una instancia de esta clase con la propiedad KeyContainerName establecida al nombre con el que identificaremos al par de claves en el almacenamiento.

Encryptar y Desencriptar mensajes usando el Algoritmo RSA

Para estas operaciones RSACryptoServiceProvider expone los métodos Encrypt() y Decrypt(); ambas devuelven un array de bytes con los datos transformados y requieren dos parámetros:

-byte[] rgb : Datos sobre los que se va a operar.

-bool fOAEP : Estableciéndolo a true, indicamos al método que  utice el sistema OAEP para truncar los datos sobrantes. Lo importante de este parámetro es que debe usarse el mismo valor tanto para el cifrado como para la descifrado de los datos.

Algoritmos de Hash (does somebody knows the spanish translation of "hash"?)

Bueno, según el WordReference es "sofrito de carne".

En el argot informático, una clave hash es un valor que se calcula a partir de unos datos y que, al menos en teoría, identifica unívocamente a dichos datos. Estas claves tienen varias aplicaciones, ente ellas por ejemplo, la posibilidad de crear identificadores de archivos de gran tamaño, o la comprobación de la originalidad de un documento.

Al contrario que la operación de encriptación, la creación de una clave hash es un proceso irreversible; a partir del valor obtenido no se puede volver al dato original.

Existen dos tipos de algoritmos hash; los no cifrados y los cifrados. Los algoritmos hash cifrados o HMAC (Hash-based Message Authentication Code) se pueden utilizar para determinar si se ha manipulado un mensaje enviado a través de un canal no seguro, siempre que el remitente y el receptor compartan una clave secreta. El remitente calcula el valor hash para los datos originales y envía el valor hash y los datos originales como un solo mensaje. El receptor actualiza el valor hash en el mensaje recibido y comprueba que el código HMAC calculado coincide con el transmitido.
Cualquier cambio en los datos o en el valor hash producirá una desigualdad, ya que es necesario conocer la clave secreta para cambiar el mensaje y reproducir el valor hash correcto. Por consiguiente, si el original y los valores hash calculados coinciden, el mensaje se autentica.

Algoritmos no cifrados

Clase Abstracta

Clase Concreta

Descripción

MD5

MD5CryptoServiceProvider

Message Digest. El más usado. La longitud de la clave generada es de 128 bits.

RIPEMD160

RIPEMD160Managed

Su clave tiene 160 bits. Es nuevo en el framework 2.0 y se ha añadido con la intención de sustituir a MD5.

SHA1

SHA1CryptoServiceProvider

Secure Hash Algorithm. Su clave tiene 160 bits.

SHA256

SHA256Managed

Su clave tiene 256 bits.

SHA384

SHA384Managed

Su clave tiene 384 bits.

SHA512

SHA512Managed

Su clave tiene 512 bits.

Algoritmos cifrados

Clase

Descripción

HMACSHA1

Hash-based Message Authentication Code using SHA1. Admite claves HMAC de cualquier longitud y la clave generada tiene 160 bits.

MACTripleDES

Message Authentication Code using TripleDES. Admite claves de 8, 16 ó 24 bytes y genera claves de 64 bits.

Pasos para generar claves hash no cifradas
1- Crear el objeto Algoritmo
2- Trasladar los datos a tratar a un array de bytes o a un Stream
3- Llamar al método de cifrado HashAlgorithm.ComputeHash()
4- Obtener el array de bytes generado en la propiedad HashAlgorithm.Hash

Ejemplo: En una aplicación de consola, generamos el valor hash mediante el algoritmo MD5 para cualquier texto introducido por el usuario.

image

Pasos para generar claves hash cifradas
1- Crear la clave secreta que deberá ser compartida por las partes interesada
2- Crear el objeto algoritmo utilizando la clave secreta generada. Si no se especifica una clave, se creará una por defecto.
3- Trasladar los datos a tratar a un array de bytes o a un Stream.
4- Llamar al método de cifrado KeyedHashAlgorithm.ComputeHash()
5- Obtener el array de bytes generado en la propiedadKeyedHashAlgorithm.Hash

Ejemplo: En una aplicación de consola, generamos el valor hash mediante el algoritmo HMACSHA1

image

Y… cómo se yo si la hash es válida o no? (pendiente)

Firma de archivos
La firma digital de un archivo es un valor que puede adjuntarse a un fichero como prueba de que alguien, en posesión de una determinada clave privada ha creado un archivo y que éste no ha sido modificado desde su creación. No debe confundirse la firma digital con la encriptación. La firma digital no protege el secreto de un archivo; para ello, el archivo debe encriptarse.

Las clases que realizan la tarea de firma de archivos son DSACryptoServiceProvider y RSACryptoServiceProvider. Los métodos de estas clases encargados de estas operaciones son los siguientes:

SignHash

Genera una firma digital basada en la clave Hash de un archivo.

SignData

Genera una firma digital generando primero la clave Hash de un archivo y luego generando la firma para dicha Hash.

VerifyHash

Verifica que la firma especificada sea válida para la clave Hash especificada

VerifyData

Verifica que la firma especificada sea válida para el contenido del archivo especificado.

Pasos para generar la firma digital para un fichero
1- Crear el objeto algoritmo
2- Trasladar los datos a tratar a un array de bytes o a un stream
3- Llamar al método SignData() y guardar la firma
4- Exportar la clave publica
Pasos para comprobar la validez de una firma digital para un fichero
1- Crear el objeto algoritmo
2- Importar la firma digital y la clave pública
3- Trasladar los datos a verificar a un array de bytes o a un stream
4- Llamar al método VerifyData()

Ejemplo: En una aplicación de consola, generamos la firma digital para un archivo pasado por parámetro. El modificador -t como primer parámetro indica la acción de comprobar la validez de la firma.

image

image

Crossposted from crisfervil.com

RegisterArrayDeclaration

http://msdn.microsoft.com/es-es/library/system.web.ui.clientscriptmanager.registerarraydeclaration.aspx

image

image

Este código, contrariamente a lo que mi retorcida lógica esperaría, no registra el array en código cliente con el valor “4,5,6”,

image

sino que produce el siguiente código JS:

image

Esto, simplificado el máximo, se detecta fácilmente, pero si empezamos a retorcerlo….

image

image

puede hacer que te tires un buen rato mirando código con cara de tonto.