29-.Aplicaciones web.Encriptando password
- En este capítulo del curso de programación en c# con visual studio
2017 aprenderemos a encriptar password utlilizando el espacion de nombres System.Security.Cryptography disponible en los frameworks de .net.
- El
espacio de nombres System.Security.Cryptography proporciona servicios criptográficos, incluidas la
codificación y descodificación segura de datos, así como muchas otras
operaciones, como cálculos hash, generación de números aleatorios y la
autenticación de mensajes.
- Una vez tengamos la contraseña cifrada la guardamos en la base de datos mediante una llamada a un procedimiento almacenado. En el video tenéis todo el proceso, tanto el cifrado como la llamada al procedimiento almacenado para guardar en base de datos.
- Os dejo unos enlaces a páginas donde podéis completar información sonre este tema:
- https://msdn.microsoft.com/es-es/library/system.security.cryptography(v=vs.110).aspx
- https://msdn.microsoft.com/es-es/library/system.security.cryptography.aes(v=vs.110).aspx
- https://msdn.microsoft.com/es-es/library/92f9ye3s(v=vs.110).aspx
- Como acostumbro os dejo también el código visto en el ejemplo:
- Clase que utilizo para el cifrado/encriptación:
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web;
namespace GestionVarios
{
public class Cifrado
{
Aes miAes = null;
public Cifrado(byte[] clave)
{
miAes = Aes.Create();
miAes.Key = clave;
}
public byte[] cifrar(string original)
{
byte[] encrypted = EncriptarStringToBytesAes(original, miAes.Key, miAes.IV);
return encrypted;
}
public string descifrar(byte[] encrypted)
{
string roundtrip = DesencriptarStringFromBytesAes(encrypted, miAes.Key, miAes.IV);
return roundtrip;
}
private byte[] EncriptarStringToBytesAes(string cadena, byte[] clave, byte[] IV)
{
if (cadena == null || cadena.Length <= 0)
throw new ArgumentNullException("plainText");
if (clave == null || clave.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");
byte[] encrypted;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = clave;
aesAlg.IV = IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(cadena);
}
encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
}
private string DesencriptarStringFromBytesAes(byte[] textoCifrado, byte[] clave, byte[] IV)
{
if (textoCifrado == null || textoCifrado.Length <= 0)
throw new ArgumentNullException("cipherText");
if (clave == null || clave.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");
string plaintext = null;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = clave;
aesAlg.IV = IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(textoCifrado))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
}
}
- aspx de alta de usuario:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<table width="700px" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="left">
<h1>Datos de acceso</h1>
<br />
</td>
</tr>
<tr>
<td width="250px" height="22px" align="left" style="vertical-align: top">Nombre usuario:</td>
<td width="450px" align="left" style="vertical-align: top">
<asp:TextBox ID="txtnombre" runat="server" Width="300px" ForeColor="Black" ></asp:TextBox>
<asp:RequiredFieldValidator ID="reqNombre" runat="server" ControlToValidate="txtnombre" ErrorMessage="*" Display="Dynamic" ForeColor="Red" ></asp:RequiredFieldValidator><br />
</td>
</tr>
<tr>
<td width="250px" height="22px" align="left" style="vertical-align: top">Pais:</td>
<td width="450px" align="left" style="vertical-align: top">
<asp:DropDownList runat="server" id="cmbPaises" AppendDataBoundItems="True" Width="311px" DataSourceID="SqlDataSource1" DataTextField="Pais" DataValueField="CodPais">
<asp:ListItem Text="Seleccione un pais" Value="-1">-SELECCIONAR-</asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePaises" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
<asp:RequiredFieldValidator id="reqPais" ControlToValidate="cmbPaises" ErrorMessage="* Seleccione pais" Display="Dynamic" InitialValue="-1" runat="server" ForeColor="Red" />
</td>
</tr>
<tr>
<td width="250px" height="22px" align="left" style="vertical-align: top">Dirección de E-Mail:
</td>
<td width="450px" align="left" style="vertical-align: top">
<asp:TextBox ID="mtxtEMail" runat="server" Width="300px" ForeColor="Black" ></asp:TextBox>
<asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="*" Display="Dynamic" ForeColor="Red" ></asp:RequiredFieldValidator><br />
<asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="La Dirección de E-Mail especificada no es válida.<br>" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td width="250px" height="22px" align="left" style="vertical-align: top">Contraseña:
</td>
<td width="450px" align="left" style="vertical-align: top">
<asp:TextBox ID="mtxtPassword" runat="server" Width="150px" MaxLength="20" TextMode="Password"></asp:TextBox>
<br />
<asp:RequiredFieldValidator ID="mreqPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="Debe especificar una contraseña de al menos 6 caracteres.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="mregPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="La contraseña no es correcta (min. 6 cars)." ValidationExpression="\w+.{5,}" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td width="250px" height="22px" align="left" style="vertical-align: top">Confirmar Contraseña:
</td>
<td width="450px" align="left" style="vertical-align: top">
<asp:TextBox ID="mtxtPassword2" runat="server" Width="150px" MaxLength="20" TextMode="Password" ></asp:TextBox>
<br />
<asp:RequiredFieldValidator ID="mreqPassword2" runat="server" ControlToValidate="mtxtPassword2" ErrorMessage="Debe confirmar la contraseña.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="mcomPasswords" runat="server" ErrorMessage="Las contraseñas no son iguales." Display="Dynamic" ControlToCompare="mtxtPassword" ControlToValidate="mtxtPassword2" ForeColor="Red"></asp:CompareValidator>
</td>
</tr>
<tr>
<td> </td>
<td width="250px" height="22px" align="left" style="vertical-align: top">
<asp:CheckBox ID="chkCondiciones" runat="server"/><asp:HyperLink ID="linkCondiciones" runat="server" Text="Condiciones servicio" NavigateUrl="~/CondicionesServicio.aspx"></asp:HyperLink><br />
</td>
</tr>
<tr>
<td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="center" colspan="2">
<asp:Button ID="mbtnRegistrar" runat="server" Text="ALTA" OnClick="mbtnRegistrar_Click" />
<asp:Label runat="server" ID="lblError" Visible="false" ForeColor="Red"></asp:Label>
</td>
</tr>
</table>
</form>
</body>
</html>
- fichero cs del alta de cliente:
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace GestionVarios
{
public partial class AltaUsuario : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void mbtnRegistrar_Click(object sender, EventArgs e)
{
lblError.Visible = true;
if (chkCondiciones.Checked == false)
{
lblError.Text = "Debes aceptar los términos y condiciones del servicio.";
}
else
{
byte[] passCifrada = cifrar(mtxtPassword.Text.Trim());
if (guardarUsuario(passCifrada))
{
lblError.Text = "Usuario dado de alta correctamente";
lblError.ForeColor = Color.Green;
}
}
}
private Boolean guardarUsuario(byte[] passCifrada)
{
Boolean todoOk = true;
SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
try
{
conexion.Open();
SqlCommand com = conexion.CreateCommand();
com.CommandType = System.Data.CommandType.StoredProcedure;
com.CommandText = "dbo.AltaUsuario";
com.Parameters.Add("@nombre",SqlDbType.VarChar,255).Value=txtnombre.Text;
com.Parameters.Add("@email", SqlDbType.VarChar, 255).Value = mtxtEMail.Text;
com.Parameters.Add("@pass", SqlDbType.VarBinary, 8000).Value = passCifrada;
com.Parameters.Add("@codPais", SqlDbType.VarChar, 3).Value = cmbPaises.SelectedValue;
com.ExecuteNonQuery();
}
catch (Exception ex)
{
lblError.Text = "Se produjo un error guardando el usuario." + ex.Message;
lblError.ForeColor = Color.Red;
todoOk = false;
}
finally
{
if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
conexion.Close();
conexion.Dispose();
}
return todoOk;
}
private byte[] cifrar(string cadenaAcifrar)
{
String miclave = ConfigurationManager.AppSettings["clave"];
byte[] claveCifrado = System.Text.Encoding.ASCII.GetBytes(miclave);
Cifrado c = new Cifrado(claveCifrado);
byte[] b = c.cifrar(cadenaAcifrar);
return b;
}
}
}
No hay comentarios:
Publicar un comentario