Pop

29.Aplicaciones web.Encriptando password.Curso de C# con Visual Studio 2017.

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:

  1. https://msdn.microsoft.com/es-es/library/system.security.cryptography(v=vs.110).aspx
  2. https://msdn.microsoft.com/es-es/library/system.security.cryptography.aes(v=vs.110).aspx
  3. 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;
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:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AltaUsuario.aspx.cs" Inherits="GestionVarios.AltaUsuario" %>
<!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>&nbsp;</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;
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

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...