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.

 

Un comentario en “Windows Phone 7 – Tutorial XXVIII–Seguridad II – Encriptación de Datos”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *