Categorías destacadas
programacion php    
Artículo
2
¡votar!

 Seguridad Windows Phone 7 - Encriptación de datos

En este segundo artículo 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
• HMACSHA
• 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
encriptación de datos 1

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

Que corresponde con la pantalla
encritar datos 2

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.

string message = txtMessage.Text;
string key = txtKey.Text;
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
HMACSHA256 hmacsha256 = new HMACSHA256(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
textBlock1.Text = ConvertToString(hashmessage);
hashmessage = hmacsha256.ComputeHash(messageBytes);
textBlock2.Text = ConvertToString(hashmessage);


Como podéis observar en el código de arriba la magia está 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

public static string ConvertToString(byte[] buff){
string sbinary = "";
for (int i = 0; i < buff.Length; i++){
//hex-formatted
sbinary += buff[i].ToString("X2");
}
return (sbinary);
}
}


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

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

Código ejemplo : http://cid-8f5827db042e87d3.office.live.com/browse.aspx/Blog/HMACTest

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
encriptacion datos 4

Nuestra interfaz de usuario seria de la siguiente manera

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


Lo que nos daría la siguiente pantalla
encriptacion datos 5

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

public string Encrypt(string dataToEncrypt, string password, string salt){
AesManaged aes = null;
MemoryStream memStream = null;
CryptoStream crStream = null;
try{
//Generate a Key based on a Password and Salt
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));
//Create AES algorithm with 256 bit key and 128-bit block size
aes = new AesManaged();
aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
aes.IV = rfc2898.GetBytes(aes.BlockSize / 8);
memStream = new MemoryStream();
crStream = new CryptoStream(memStream, aes.CreateEncryptor(),CryptoStreamMode.Write);
byte[] data = Encoding.UTF8.GetBytes(dataToEncrypt);
crStream.Write(data, 0, data.Length);
crStream.FlushFinalBlock();
//Return Base 64 String
return Convert.ToBase64String(memStream.ToArray());
}
finally{
//cleanup
if (crStream != null)
crStream.Close();
if (memStream != null)
memStream.Close();
if (aes != null)
aes.Clear();
}
}


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 .

public string Decrypt(string dataToDecrypt, string password, string salt){
AesManaged aes = null;
MemoryStream memStream = null;
CryptoStream crStream = null;
try{
Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));
aes = new AesManaged();
aes.Key = rfc2898.GetBytes(aes.KeySize / 8);
aes.IV = rfc2898.GetBytes(aes.BlockSize / 8);
memStream = new MemoryStream();
crStream = new CryptoStream(memStream, aes.CreateDecryptor(),CryptoStreamMode.Write);
byte[] data = Convert.FromBase64String(dataToDecrypt);
crStream.Write(data, 0, data.Length);
crStream.FlushFinalBlock();
byte[] decryptBytes = memStream.ToArray();
return Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
}
finally{
if (crStream != null)
crStream.Close();
if (memStream != null)
memStream.Close();
if (aes != null)
aes.Clear();
}
}


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

private void button1_Click(object sender, RoutedEventArgs e){
txtEncryptedData.Text = Encrypt(txtDataToEncrypt.Text, txtPassword.Text, txtSalt.Text);
txtDecryptedData.Text = Decrypt(txtEncryptedData.Text, txtPassword.Text,txtSalt.Text);
}


Ejecutando la aplicación obtendríamos
encriptación datos 6

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.

Código ejemplo: http://cid-8f5827db042e87d3.office.live.com/browse.aspx/Blog/AESEncryption

Autor del artículo: Oskar Álvarez
   
Publicado por:
angel carrero
Recomendar
a un amigo
Compartir
en redes
 
Comentarios
 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon