Windows Phone 7 – Tutorial XXXI–Seguridad V–Autenticación Basica

Cuando nos conectamos a través de servicios WCF, si estos servicios están desarrollados por nosotros es recomendable que utilicemos autenticación en los mismos intentando que al menos las llamadas a nuestros servicios web tengan autenticación.

En este caso vamos a ver la autenticación básica  de nuestros servicios WCF, lo primero que tenemos que hacer es habilitar la autenticación básica en nuestros sitio Web que aloja los servicios web que consumimos, esto lo configuramos en el Internet Information Services (IIS) Manager console (Start ➪ Control Panel ➪ Administrative Tools IIS Manager) seleccionamos nuestros sitio y habilitamos Basic Authentication como en la imagen pulsando en Enable

image

Si deshabilitamos Anonymous Authentication y habilitamos Basic Authentication si nos vamos al Internet Explorer veremos que nos pedirá un usuario y password que serán las credenciales de Windows.

Para llamar al servicio WCF desde tu aplicación de Windows Phone 7 deberemos de enviar las credenciales en en la propiedad Credentials del objeto HttpWebRequest, tan sencillo como este código

1 private void BasicCallServiceButton_Click(object sender, RoutedEventArgs e){ 2 var client = new BasicAuthSample.BasicAuthServiceClient(); 3 client.ClientCredentials.UserName.UserName =<username>”; 4 client.ClientCredentials.UserName.Password =<password>”; 5 client.DoWorkCompleted += BasicService_DoWorkCompleted; 6 client.DoWorkAsync(); 7 } 8 void BasicService_DoWorkCompleted(object sender, AsyncCompletedEventArgs e){...}

1 private void BasicAuthButton_Click(object sender, RoutedEventArgs e) 2 { 3 var request = HttpWebRequest.Create(“http://localhost/AuthSample/BasicAuth/BasicAuthText.txt”); 4 request.Credentials = new NetworkCredential(“ < username > ”, “ < password > ”); 5 request.BeginGetResponse(FileComplete, request); 6 }

Aparte de incluir en las credenciales el usuario y password deberemos de configurar nuestro servicio WCF indicándole que espere Basic Authentication, estolo configuramos en el elemento basicHttpBinding poniendo el modo a TransportCredentialOnly y asignando clientCredentialType a true.

1 <system.serviceModel> 2 <services> 3 <service behaviorConfiguration="BasicAuthBehavior" name="AuthSample.BasicAuth.BasicAuthService"> 4 <endpoint binding="basicHttpBinding" 5 bindingConfiguration="basicAuth" 6 contract="AuthSample.BasicAuth.IBasicAuthService" /> 7 <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />--> 8 </service> 9 10 </services> 11 <bindings> 12 <basicHttpBinding> 13 <binding name="basicAuth"> 14 <security mode="TransportCredentialOnly"> 15 <transport clientCredentialType="Basic" /> 16 </security> 17 </binding> 18 19 </basicHttpBinding> 20 </bindings> 21 22

Cuando añadimos la referencia a nuestra aplicación de WCF automáticamente se creara el fichero Client.Config y veremos que el elemento 

security mode="TransportCredentialOnly"

 

1 <system.serviceModel > 2 <bindings > 3 <basicHttpBinding > 4 <binding name="BasicHttpBinding_IBasicAuthService" 5 maxBufferSize=”2147483647” 6 maxReceivedMessageSize=”2147483647” > 7 <security mode="TransportCredentialOnly" /> 8 </binding> 9 </basicHttpBinding> 10 </bindings> 11 <client> 12 <endpoint address="http://localhost/AuthSample/BasicAuth/BasicAuthService.svc" 13 binding=”basicHttpBinding” 14 bindingConfiguration=”BasicHttpBinding_IBasicAuthService” 15 contract=”BasicAuthSample.IBasicAuthService” 16 name=”BasicHttpBinding_IBasicAuthService” /> 17 </client> 18 </system.serviceModel>

A la hora de desarrollar debemos de tener en cuenta que si deshabilitamos Anonymous Authentication en el IIS, debemos de eleiminar el endpoint mex vereis que en el código anterior esta comentado, sino el servicio al llamarlo os dará un error, pero al quitar el endpoint mex no podremos añadirlo a nuestra aplicación de Windows Phone, por lo que tenemos que jugar con esta configuración para ejecutar y para añadir la referencia a nuestro servicio WCF.

Debemos de tener en cuenta que el usuario y password se envían en texto plano, con lo que utilizarlo sin SSL como vimos anteriormente en mi opinión no sirve de nada.    

Windows Phone 7 – Tutorial XXX–Seguridad IV – Seguridad en la red

Si tu aplicación accede a datos sensibles a través de la conexión de datos debemos asegurarnos en implementar mecanismos de autenticación como certificados  y  SSL para la encriptación de datos.

Conexiones Seguras con SSL

El protocolo SSL es el mas sofisticado a la hora de securizar conexiones entre el cliente (nuestro teléfono) y el servicio, utiliza el concepto de criptografia asimétrica y certificación. Cuando Windows Phone inicia una conexión aun servicio remoto se chequea el certificado y la autoridad que emitió el certificado, una vez que el CA es conocido Windows Phone 7 chequea si esta en su lista de entidades certificadoras. Si la encuentra inicia la conexión segura, en caso contario nos mostrará un error y no se conectará al servicio entendiendo que no es de confianza.

Windows Phone 7 viene con algunas entidades certificadoras instaladas, en esta entrada http://msdn.microsoft.com/en-us/library/gg521150(v=VS.92).aspx tenéis la lista completa.

Si queremos testear y abrir una conexión SSL por ejemplo con PayPal vamos a seguir los siguientes pasos.

 

El camino mas rápido para testear una conexión SSL es utilizar el navegador del emulador, abrimos internet explorer en el emulador y ponemos la dirección https://www.paypal.com deberíamos de ver la página de PayPal correctamente

 

image   

 

Vamos a crear una pequeña aplicación para conectarnos a PayPal a través de SSL, lo que nos serviría como ejemplo de conexión a cualquier servicio que sea expuesto a través de SSL siempre que este en la lista de entidades certificadoras que viene en Windows Phone 7 el certificado que utilice.

Creamos la aplicación SSLConnection

 

image

En la pantalla arrastramos un control WebBrowser quedándonos el XAML

 

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 7 <!--TitlePanel contains the name of the application and page title--> 8 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 9 <TextBlock x:Name="SSLConection" Text="SSLConection" Style="{StaticResource PhoneTextNormalStyle}"/> 10 <TextBlock x:Name="PayPal" Text="PayPal" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 11 </StackPanel> 12 13 <!--ContentPanel - place additional content here--> 14 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 15 <phone:WebBrowser HorizontalAlignment="Left" Margin="6,6,0,0" Name="webBrowser1" VerticalAlignment="Top" Height="595" Width="450" /> 16 </Grid> 17 </Grid>

 

Ahora en code-behind en el constructor añadimos el código

 

1 WebClient client = new WebClient(); 2 client.OpenReadCompleted += new 3 OpenReadCompletedEventHandler(HandleResponse); 4 client.OpenReadAsync(new Uri("https://www.paypal.com"));

Y en el manejador del evento

1 void HandleResponse(object sender, OpenReadCompletedEventArgs e) 2 { 3 StreamReader reader = new StreamReader(e.Result); 4 string res = reader.ReadToEnd(); 5 webBrowser1.NavigateToString(res); 6 }

El resultado de ejecutarlas es

 

image

 

Como podéis ver en este tonto ejemplo al ser una entidad certificadora que ya viene instalada en el teléfono no tenemos que hacer nada especial, pero que pasa si quiero usar mi propio certificado ya que utilizar el de estas entidades certificadoras me sale caro, en este caso deberemos de realizar los siguientes pasos

Crear mi propio certificado

Con ISS 7 puedo crear mis propios certificados y además habilitar SSL usando estos certificados de una manera sencilla con estos pasos que explicamos a continuación

 

Abrimos el IIS Manager  Start –> Control Panel –> Administrative Tools –>Internet Information Services (IIS) Manager. Una vez abierto creamos un nuevo sitio Web y le llamamos WP7Server con las propiedades de la imagen

 

image

El siguiente paso es crear nuestro propio certificado, para ello seleccionamos el nodo raíz y nos aparece Certificados del servidor

image

 

Lo seleccionamos y en el menú de la derecha seleccionamos Crear Certificado Autofirmado y le damos el nombre de wp7cert.

 

image

Ahora debemos de habilitar SSL en el sitio web para ello seleccionamos el sitio Web y en el menú de la derecha hacemos click en Enlaces

image

Agregamos uno y en la pantalla seleccionamos https y al pedir el certificado seleccionamos el que hemos creado

image

Ahora necesitamos crear contenido en nuestro sitio web, para este ejemplo crearemos una sencilla pagina html con este código

 

1 <html> 2 <h1>Hola, Windows Phone 7</h1> 3 </html>

Al archivo lo llamaremos index.html, ahora si abrimos internet explorer con la url https://localhost/WP7Server obtendremos la siguiente pantalla

 

image

Si diésemos a continuar accederíamos al sitio web ya que indicamos que confiamos en el certificado, pero esto no es deseable en nuestros desarrollos ya que deberíamos instalar  el certificado en nuestros dispositivos para que no salga la pantalla de advertencia. Para ello seguiremos los siguientes pasos

Primero exportar el certificado para ello desde Internet Explorer pulsamos en Tools y en la pestaña Content pulsamos en certificados

imageimage

Dentro de la lista seleccionamos el que hemos creado y le damos a exportar

image

 

Seleccionamos No exportar la clase privada

image

Seleccionamos DER binario codificado X.509 y el siguiente paso es darle el nombre del fichero, para instalarlo en nuestro dispositivo o emulador lo haremos a través del correo, en el coreo lo seleccionaremos y lo instalaremos de manera que cuando utilicemos este certificado nuestro dispositivo lo reconocerá, para instalarlo en el emulador lo podemos enviar a una cuenta de hotmail y desde el navegador acceder al mensaje.

En el ejemplo hemos visto como acceder a una pagina web nuestra con SSL, este mismo ejemplo de instalación nos valdría para la comunicación entre servicios WCF, por ejemplo si tenemos un servicio con transporte sobre SSL

 

 

1 < system.serviceModel > 2 < services > 3 < service behaviorConfiguration=”SSLServiceBehaviors” 4 name=”WebAuthSample.SSLService” > 5 < endpoint binding=”basicHttpBinding” 6 bindingConfiguration=”securedWithSSL” 7 contract=”WebAuthSample.ISSLService” / > 8 < /service > 9 < /services > 10 < bindings > 11 < basicHttpBinding > 12 <binding name=”securedWithSSL” > 13 <security mode=”Transport” /> 14 </binding> 15 </basicHttpBinding> 16 </bindings> 17 <behaviors> 18 <serviceBehaviors> 19 <behavior name=”SSLServiceBehaviors”> 20 <serviceDebug includeExceptionDetailInFaults=”false” /> 21 </behavior> 22 </serviceBehaviors> 23 </behaviors> 24 </system.serviceModel>

 

 

Las líneas importantes son :

<binding name=”securedWithSSL” >

    <security mode=”Transport” />

</binding>

 

En el cliente, en nuestra aplicación de teléfono

 

1 < system.serviceModel > 2 < bindings > 3 < basicHttpBinding > 4 < binding name=”BasicHttpBinding_ISSLService” maxBufferSize=”2147483647” 5 maxReceivedMessageSize=”2147483647” > 6 <security mode=”Transport” /> 7 </binding> 8 </basicHttpBinding> 9 </bindings> 10 <client> 11 <endpoint address=”https://developmentserver/WebAuthSample/SSLService.svc” 12 binding=”basicHttpBinding” 13 bindingConfiguration=”BasicHttpBinding_ISSLService” 14 contract=”SecuredService.ISSLService” 15 name=”BasicHttpBinding_ISSLService” /> 16 </client> 17 </system.serviceModel>

Con esta configuración podemos invocar un servicio WCF sobre SSL , simplemente indicando el endpoint seguro es decir que la dirección comience por https

Windows Phone 7 – Tutorial XXIX–Seguridad III – Encriptación de Datos II

En el anterior artículo vimos la encriptación HMAC, en este vamos a ver

 

Rfc2898DeriveBytes y AES para Encriptación de Datos

Para cifrar los datos de miradas indiscretas en un dispositivo de Windows 7, se necesita un cifrado de alta seguridad mecanismo que, a su vez, se basa en una clave de cifrado fuerte para soportar todos los intentos de romperla. El algoritmo Rfc2898DeriveBytes crea una clave en encriptación para usarlo en una encriotacion AES como password. En el siguiente ejemplo vamos a ver como utilizar estos dos algoritmos conjuntamente para construir un cifrado muy complicado de romper.

En este caso crearemos una solución con el nombre AESEncryption

image_thumb9

Nuestra interfaz de usuario seria de la siguiente manera

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 <!--TitlePanel contains the name of the application and page title--> 7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12"> 8 <TextBlock x:Name="ApplicationTitle" Text="CLASSIFIED" Style="{StaticResource PhoneTextNormalStyle}"/> 9 <TextBlock x:Name="PageTitle" Text="AES Encryption" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 10 </StackPanel> 11 <!--ContentPanel - place additional content here--> 12 <Grid x:Name="ContentGrid" Grid.Row="1"> 13 <TextBox Height="65" HorizontalAlignment="Left" Margin="6,41,0,0" Name="txtDataToEncrypt" Text="" VerticalAlignment="Top" Width="462" /> 14 <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,21,0,0" Name="textBlock1" Text="Datos a encriptar:" VerticalAlignment="Top" Width="419" /> 15 <TextBox Height="72" HorizontalAlignment="Left" Margin="6,334,0,0" Name="txtPassword" Text="" VerticalAlignment="Top" Width="462" /> 16 <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,310,0,0" Name="textBlock2" Text="Password" VerticalAlignment="Top" Width="346" /> 17 <TextBox Height="72" HorizontalAlignment="Left" Margin="6,426,0,0" Name="txtSalt" Text="" VerticalAlignment="Top" Width="462" /> 18 <TextBlock Height="36" HorizontalAlignment="Left" Margin="21,403,0,0" Name="textBlock3" Text="Salt:" VerticalAlignment="Top" Width="304" /> 19 <Button Content="Encrypt" Height="72" HorizontalAlignment="Left" Margin="20,504,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" 20 /> 21 <TextBlock Height="30" HorizontalAlignment="Left" Margin="24,101,0,0" Name="textBlock4" Text="Datos encriptados" VerticalAlignment="Top" Width="432" /> 22 <TextBox Height="72" HorizontalAlignment="Left" Margin="8,123,0,0" Name="txtEncryptedData" Text="" VerticalAlignment="Top" Width="460" /> 23 <TextBlock Height="27" HorizontalAlignment="Left" Margin="21,197,0,00" Name="textBlock5" Text="Datos Desencriptados" VerticalAlignment="Top" Width="435" /> 24 <TextBox Height="72" HorizontalAlignment="Left" Margin="13,221,0,0" Name="txtDecryptedData" Text="" VerticalAlignment="Top" Width="460" /> 25 </Grid> 26 </Grid> 27

Lo que nos daría la siguiente pantalla

image_thumb12

Vamos a encriptar el mensaje y desencriptarlo después, para el método de encriptación necesitaremos el mensaje a encriptar, la password y salt que iran como parámetros, utilizaremos la clase Rfc2898DerivedBytes para generar una key a partir de la password y salt, esta key se utilizara en el algoritmo AES para encriptar los datos. El código seria el siguiente

1 public string Encrypt(string dataToEncrypt, string password, string salt) 2 { 3 AesManaged aes = null; 4 MemoryStream memStream = null; 5 CryptoStream crStream = null; 6 try 7 { 8 //Generate a Key based on a Password and Salt 9 Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, 10 Encoding.UTF8.GetBytes(salt)); 11 //Create AES algorithm with 256 bit key and 128-bit block size 12 aes = new AesManaged(); 13 aes.Key = rfc2898.GetBytes(aes.KeySize / 8); 14 aes.IV = rfc2898.GetBytes(aes.BlockSize / 8); 15 memStream = new MemoryStream(); 16 crStream = new CryptoStream(memStream, aes.CreateEncryptor(),CryptoStreamMode.Write); 17 byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt); 18 crStream.Write(data, 0, data.Length); 19 crStream.FlushFinalBlock(); 20 //Return Base 64 String 21 return Convert.ToBase64String(memStream.ToArray()); 22 } 23 finally 24 { 25 //cleanup 26 if (crStream != null) 27 crStream.Close(); 28 if (memStream != null) 29 memStream.Close(); 30 if (aes != null) 31 aes.Clear(); 32 } 33 } 34

Ahora para desenciptarlo el método recibirá como parámetros el mensaje encriptado la password y salt, como AES es un algoritmo simetrico utilizara la password calculada anteriormente para descencriptar el mensaje .

1 public string Decrypt(string dataToDecrypt, string password, string salt) 2 { 3 AesManaged aes = null; 4 MemoryStream memStream = null; 5 CryptoStream crStream = null; 6 try 7 { 8 Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt)); 9 aes = new AesManaged(); 10 aes.Key = rfc2898.GetBytes(aes.KeySize / 8); 11 aes.IV = rfc2898.GetBytes(aes.BlockSize / 8); 12 memStream = new MemoryStream(); 13 crStream = new CryptoStream(memStream, aes.CreateDecryptor(), 14 CryptoStreamMode.Write); 15 byte[] data = Convert.FromBase64String(dataToDecrypt); 16 crStream.Write(data, 0, data.Length); 17 crStream.FlushFinalBlock(); 18 byte[] decryptBytes = memStream.ToArray(); 19 return Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length); 20 } 21 finally 22 { 23 if (crStream != null) 24 crStream.Close(); 25 if (memStream != null) 26 memStream.Close(); 27 if (aes != null) 28 aes.Clear(); 29 } 30 } 31

Ya solo nos queda llamar a los métodos y mostrar los mensajes encriptados y desencriptados en los textbox.

1 private void button1_Click(object sender, RoutedEventArgs e) 2 { 3 txtEncryptedData.Text = Encrypt(txtDataToEncrypt.Text, txtPassword.Text, txtSalt.Text); 4 txtDecryptedData.Text = Decrypt(txtEncryptedData.Text, txtPassword.Text,txtSalt.Text); 5 } 6

Ejecutando la aplicación obtendríamos

image_thumb14

Como habéis podido ver es muy sencillo proteger nuestros datos encriptandolos, lo debemos de recordar cada vez que tratemos datos sensibles para el usuario.

Windows Phone 7 – Tutorial XXVIII–Seguridad II – Encriptación de Datos

En este segundo articulo sobre seguridad en Windows Phone 7 nos vamos a centrar en las posibilidades de encriptación de datos que ofrece Windows Phone 7. Cuando desarrollamos nuestra aplicación y guardamos datos en el teléfono a través de IsolatedStorage debemos de tener en cuenta si esos datos son sensibles como contraseñas, datos personales…, si es así, deberemos de preocuparnos de encriptar esos datos para que en el caso de accesos indebidos estos datos no sean legibles.

Windows Phone 7 nos provee a los desarrolladores de unas clases de encriptación que deberemos utilizar y que nos hace muy fácil la tarea de dotar de seguridad a nuestros desarrollos. Los algoritmos de encriptación que se nos ofrece son:

• AES
• HMACSHA1
• HMACSHA256
• Rfc2898DeriveBytes
• SHA1
• SHA256

AES es un algoritmo de encriptación simétrico, es decir, se usa la misma clave (Password) tanto para encriptar como desencriptar datos.El algoritmo AES utiliza una de las tres fortalezas de clave de cifrado: una clave de encriptación (contraseña) de 128-, 192-, o 256- bits. Cada tamaño de la clave de cifrado hace que el algoritmo se comporte ligeramente diferente, por lo que el aumento de tamaño de clave no sólo ofrecen un mayor número de bits con el que se pueden cifrar los datos, sino también aumentar la complejidad del algoritmo de cifrado.

HMACSHA1 y HMACSHA256 son algoritmos generados por un unico mensaje de autentificación (MAC) a partir de los datos y contraseña proporcionados.

Ambos algoritmos utiliza el mismo enfoque para la generación de la MAC: toman los datos y el hash con la clave secreta usando la función hash SHA1 y SHA256
Rfc2898DeriveBytes es un algoritmo que implementa PBKDF2 (función de derivación de claves basada en contraseña) utilizando un generador de números pseudoaleatorios basado en HMACSHA1 .

Vamos a ver ejemplos de algunas de las funciones de encriptación de datos para ver como se utilizan en nuestros desarrollos.

HMACSHA1 y HMACHSHA256

El primer ejemplo que vamos a construir paso a paso va a ser la implementación de estos algoritmos. Nuestro primer paso es crear una solución en Visual Studio 2010 a la que vamos a llamar HMACTest

 

image

Definiremos nuestra interfaz de usuario de la siguiente manera

1 <Grid x:Name="LayoutRoot" Background="Transparent"> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto"/> 4 <RowDefinition Height="*"/> 5 </Grid.RowDefinitions> 6 <!--TitlePanel contains the name of the application and page title--> 7 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12"> 8 <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 9 <TextBlock x:Name="PageTitle" Text="HMAC Test" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 10 </StackPanel> 11 <!--ContentPanel - place additional content here--> 12 <Grid x:Name="ContentGrid" Grid.Row="1"> 13 <Button Content="Generate" Height="72" HorizontalAlignment="Left" Margin="149,437,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click"/> 14 <TextBox Height="72" HorizontalAlignment="Left" Margin="149,23,0,0" Name="txtMessage" Text="" VerticalAlignment="Top" Width="317" /> 15 <TextBlock Height="99" HorizontalAlignment="Left" Margin="21,216,0,0" Name="textBlock1" Text="TextBlock" VerticalAlignment="Top" Width="445" TextWrapping="Wrap" /> 16 <TextBlock Height="114" HorizontalAlignment="Left" Margin="24,321,0,0" Name="textBlock2" Text="TextBlock" VerticalAlignment="Top" Width="442" TextWrapping="Wrap" /> 17 18 <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,44,0,0" Name="textBlock3" Text="Mensaje:" VerticalAlignment="Top" Width="122" /> 19 <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,129,0,0" Name="textBlock4" Text="Clave:" VerticalAlignment="Top" /> 20 <TextBox Height="72" HorizontalAlignment="Left" Margin="149,101,0,0" Name="txtKey" Text="" VerticalAlignment="Top" Width="246" /> 21 </Grid> 22 </Grid> 23

Que corresponde con la pantalla

 

image

Ahora vamos a codificar la aplicación para utilizar estos algoritmos de encriptación, el primer paso es añadir el using al assemblie System.Security.Cryptography, una vez añadido ya podemos utilizar los algoritmos que codificaremos en el evento del botón.

1 string message = txtMessage.Text; 2 string key = txtKey.Text; 3 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 4 byte[] keyByte = encoding.GetBytes(key); 5 HMACSHA1 hmacsha1 = new HMACSHA1(keyByte); 6 HMACSHA256 hmacsha256 = new HMACSHA256(keyByte); 7 byte[] messageBytes = encoding.GetBytes(message); 8 byte[] hashmessage = hmacsha1.ComputeHash(messageBytes); 9 textBlock1.Text = ConvertToString(hashmessage); 10 hashmessage = hmacsha256.ComputeHash(messageBytes); 11 textBlock2.Text = ConvertToString(hashmessage);

Como podéis observar en el código de arriba la magia esta en el método ComputeHash que transforma el mensaje en el array de bytes codificado a partir de la clave introducida, luego utilizamos el método ConvertToString para pasar del array de bytes a un string para mostrarlo en pantalla

1 public static string ConvertToString(byte[] buff) 2 { 3 string sbinary = ""; 4 for (int i = 0; i < buff.Length; i++) 5 { 6 //hex-formatted 7 sbinary += buff[i].ToString("X2"); 8 } 9 return (sbinary); 10 } 11 } 12

Si ejecutamos la aplicación e introducimos los valores Hola Mundo para el mensaje y test para la clave obtendremos

image

 

Podéis observar la longitud de la MAC generada por uno y otro algoritmo, esta longitud es claramente mayor en el algoritmo HMACSHA256.

 

Windows Phone 7 – Tutorial XXVII–Seguridad I – Dispositivo Fisico

Este es el primer articulo de una serie dedicada a la seguridad en el desarrollo de aplicaciones para Windows Phone 7 en Silverlight, en los que iremos tratando los diferentes elementos que tenemos para realizar aplicaciones seguras para Windows Phone7. En este primer articulo veremos la seguridad que nos da el sistema operativo como usuario y como Microsoft se ha tomado en serio la seguridad en este dispositivo.

Como usuario de Windows Phone 7 debemos de proteger nuestros datos tanto para robos como accesos indebidos a nuestro dispositivo, la primera acción que tenemos que realizar es activar la solicitud de password cuando desbloquemos nuestro teléfono para realizar cualquier acción, esto es muy sencillo de realizar y en las siguientes imágenes podéis ver los pasos a realizar.

image

La acción de poner una password de acceso a nuestro teléfono podéis pensar que es básica, pero si además de proteger nuestro teléfono mediante la introducción de una password, se nos ofrece una web desde la que podemos localizar nuestro teléfono, hacerlo sonar, bloquearlo e incluso borrar los datos almacenados en el teléfono, podemos ir muy tranquilos con nuestro dispositivo de windows phone 7 contra robos y perdidas.

En el portal http://windowsphone.live.com asociaremos nuestro teléfono con un id de Windows Live y a partir de entonces tendremos acceso a nuestro dispositivo físico desde la web

image 

Podemos enviarle un mensaje a la vez que lo bloqueamos, este bloqueo no inutiliza el telefono sino que es necesario introducir una password para que el telefono pueda volver a ser usado.

image

También podemos localizarlo en un mapa por si nos hemos olvidado de el en algún lugar y no recordamos, donde, la función “Map it” nos mostrará la situación de nuestro  teléfono en un mapa, esta localización se produce con el GPS que viene incorporado o a través de las antenas GSM o wifi.

image

Como podéis ver la seguridad física que se ofrece en un teléfono Windows Phone 7 es bastante completa y estudiada para proteger nuestro teléfono y datos contra accesos indebidos. En los siguientes artículos veremos el concepto de seguridad desde el punto de vista del desarrollador.