Laboratorio de Codificación Segura

Python

En este primer laboratorio vamos a aprender a implementar prácticas de codificación segura en Python mediante la validación de entradas y el manejo seguro de datos sensibles.

Objetivo:

Aprender a implementar prácticas de codificación segura en Python mediante la validación de entradas y el manejo seguro de datos sensibles.

Requisitos:

  • Python 3.12.4 o superior
  • Editor de código (por ejemplo, VS Code, PyCharm)

Paso 1: Configuración del entorno

  • Instalación de Python:
  • Asegúrate de tener Python instalado. Puedes descargarlo desde www.python.org.

Creación de un entorno virtual:

python -m venv venv
source venv/bin/activate  # En Windows usa `venv\Scripts\activate`

Instalación de las dependencias necesarias:

En este laboratorio no se requieren dependencias externas adicionales.

Paso 2: Validación de entradas

Creación del archivo de validación:

  • Crea un archivo llamado validation.py.

  • Implementación de la función de validación de correo electrónico:

  • Copia y pega el siguiente código en validation.py:

import re

def validar_correo(correo):
    patron = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    if re.match(patron, correo):
        return True
    else:
        return False

# Uso de la función
if __name__ == "__main__":
    correo = "test@example.com"
    if validar_correo(correo):
        print("Correo válido")
    else:
        print("Correo inválido")

Ejecución del código:

En la terminal, navega hasta el directorio que contiene validation.py y ejecuta:

python validation.py

Deberías ver el mensaje “Correo válido” en la salida.

Paso 3: Validación adicional

Validación de números de teléfono:

  • Agrega la siguiente función a validation.py para validar números de teléfono:
def validar_telefono(telefono):
    patron = r'^\+?1?\d{9,15}$'
    if re.match(patron, telefono):
        return True
    else:
        return False

# Uso de la función
if __name__ == "__main__":
    telefono = "+12345678901"
    if validar_telefono(telefono):
        print("Teléfono válido")
    else:
        print("Teléfono inválido")

Ejecución del código:

Ejecuta el archivo de nuevo para ver la validación de teléfono.


Java

En este laboratorio vamos a aprender a implementar prácticas de codificación segura en Java mediante la gestión segura de contraseñas.

Objetivo:

Aprender a implementar prácticas de codificación segura en Java mediante la gestión segura de contraseñas.

Requisitos:

  • Java 8 o superior
  • IDE de Java (por ejemplo, IntelliJ IDEA, Eclipse)

Paso 1: Configuración del entorno

Instalación de Java:

Asegúrate de tener Java instalado. Puedes descargarlo desde www.oracle.com.

Creación de un proyecto en tu IDE:

Abre tu IDE y crea un nuevo proyecto Java.

Paso 2: Gestión de contraseñas

Creación de la clase de utilidades de contraseña:

Crea una clase llamada PasswordUtils en tu proyecto.

Implementación de la función de hash de contraseña:

Copia y pega el siguiente código en PasswordUtils.java:


import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Base64;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public class PasswordUtils {
    public static String hashPassword(String password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        byte[] hash = factory.generateSecret(spec).getEncoded();
        return Base64.getEncoder().encodeToString(hash);
    }
}

Uso de la función de hash de contraseña:

Crea una clase Main para probar la función:

import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        try {
            String password = "mySecurePassword";
            byte[] salt = new byte[16];
            new Random().nextBytes(salt);

            String hashedPassword = PasswordUtils.hashPassword(password, salt);
            System.out.println("Hashed Password: " + hashedPassword);
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
    }
}

Ejecución del código:

Ejecuta la clase Main en tu IDE. Deberías ver la contraseña hasheada impresa en la consola.


JavaScript

Objetivo:

Aprender a implementar prácticas de codificación segura en JavaScript mediante la validación de entradas y el manejo seguro de datos sensibles.

Requisitos:

  • Node.js y npm instalados
  • Editor de código (por ejemplo, VS Code)

Paso 1: Configuración del entorno

Instalación de Node.js:

Asegúrate de tener Node.js instalado. Puedes descargarlo desde nodejs.org.

Creación de un proyecto Node.js:

En la terminal, crea una nueva carpeta para tu proyecto y navega a ella:

mkdir secure-coding-js
cd secure-coding-js

Inicialización del proyecto:

Inicializa un nuevo proyecto Node.js:

npm init -y

Instalación de dependencias:

Para este laboratorio, instalaremos las siguientes dependencias:

  • bcrypt para el manejo seguro de contraseñas
npm install bcrypt

Paso 2: Validación de entradas

Creación del archivo de validación:

Crea un archivo llamado validation.js.

  • Implementación de la función de validación de correo electrónico:
  • Copia y pega el siguiente código en validation.js:
function validarCorreo(correo) {
    const patron = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
    return patron.test(correo);
}

// Uso de la función
const correo = "test@example.com";
if (validarCorreo(correo)) {
    console.log("Correo válido");
} else {
    console.log("Correo inválido");
}

Ejecución del código:

En la terminal, ejecuta el archivo validation.js:

node validation.js

Deberías ver el mensaje “Correo válido” en la salida.

Paso 3: Gestión de contraseñas

  • Creación del archivo de gestión de contraseñas:
  • Crea un archivo llamado password.js.

Implementación de la función de hash de contraseña:

  • Copia y pega el siguiente código en password.js:
const bcrypt = require('bcrypt');

async function hashPassword(password) {
    const saltRounds = 10;
    const hashedPassword = await bcrypt.hash(password, saltRounds);
    return hashedPassword;
}

async function main() {
    const password = "mySecurePassword";
    const hashedPassword = await hashPassword(password);
    console.log("Hashed Password:", hashedPassword);
}

main().catch(err => console.error(err));

Ejecución del código:

  • En la terminal, ejecuta el archivo password.js:
node password.js

Deberías ver la contraseña hasheada impresa en la consola.

Paso 4: Validación adicional

  • Validación de números de teléfono:

  • Agrega la siguiente función a validation.js para validar números de teléfono:

function validarTelefono(telefono) {
    const patron = /^\+?1?\d{9,15}$/;
    return patron.test(telefono);
}

// Uso de la función
const telefono = "+12345678901";
if (validarCorreo(correo)) {
    console.log("Correo válido");
} else {
    console.log("Correo inválido");
}

if (validarTelefono(telefono)) {
    console.log("Teléfono válido");
} else {
    console.log("Teléfono inválido");
}

Ejecución del código:

Ejecuta el archivo validation.js de nuevo para ver la validación de teléfono.


C#

Objetivo:

Aprender a implementar prácticas de codificación segura en C# mediante la validación de entradas y el manejo seguro de contraseñas.

Requisitos:

  • .NET SDK instalado
  • Visual Studio o Visual Studio Code

Paso 1: Configuración del entorno

  • Instalación de .NET SDK:
  • Asegúrate de tener el .NET SDK instalado. Puedes descargarlo desde dotnet.microsoft.com.

Creación de un nuevo proyecto:

  • En la terminal, crea una nueva carpeta para tu proyecto y navega a ella:
mkdir SecureCodingCSharp
cd SecureCodingCSharp

Inicialización de un nuevo proyecto de consola:

dotnet new console

Paso 2: Validación de entradas

  • Creación de la clase de validación:
  • En el archivo Program.cs, implementa la siguiente función de validación de correo electrónico:
using System;
using System.Text.RegularExpressions;

namespace SecureCodingCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            string correo = "test@example.com";
            if (ValidarCorreo(correo))
            {
                Console.WriteLine("Correo válido");
            }
            else
            {
                Console.WriteLine("Correo inválido");
            }
        }

        static bool ValidarCorreo(string correo)
        {
            string patron = @"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$";
            return Regex.IsMatch(correo, patron);
        }
    }
}

Ejecución del código:

En la terminal, ejecuta el proyecto:

dotnet run

Deberías ver el mensaje “Correo válido” en la salida.

Paso 3: Gestión de contraseñas

  • Creación de la clase de gestión de contraseñas:

  • Crea un nuevo archivo llamado PasswordUtils.cs y agrega el siguiente código:

using System;
using System.Security.Cryptography;

public class PasswordUtils
{
    public static string HashPassword(string password, byte[] salt)
    {
        using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, 10000))
        {
            return Convert.ToBase64String(rfc2898DeriveBytes.GetBytes(256));
        }
    }

    public static byte[] GenerateSalt()
    {
        byte[] salt = new byte[16];
        using (var rngCryptoServiceProvider = new RNGCryptoServiceProvider())
        {
            rngCryptoServiceProvider.GetBytes(salt);
        }
        return salt;
    }
}

Uso de la función de hash de contraseña:

Modifica el archivo Program.cs para incluir el uso de la clase PasswordUtils:

using System;

namespace SecureCodingCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            string correo = "test@example.com";
            if (ValidarCorreo(correo))
            {
                Console.WriteLine("Correo válido");
            }
            else
            {
                Console.WriteLine("Correo inválido");
            }

            string password = "mySecurePassword";
            byte[] salt = PasswordUtils.GenerateSalt();
            string hashedPassword = PasswordUtils.HashPassword(password, salt);
            Console.WriteLine("Hashed Password: " + hashedPassword);
        }

        static bool ValidarCorreo(string correo)
        {
            string patron = @"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$";
            return Regex.IsMatch(correo, patron);
        }
    }
}

Ejecución del código:

En la terminal, ejecuta el proyecto de nuevo:

dotnet run

Deberías ver la contraseña hasheada impresa en la consola.

Paso 4: Validación adicional

Validación de números de teléfono:

Agrega la siguiente función a Program.cs para validar números de teléfono:

static bool ValidarTelefono(string telefono)
{
    string patron = @"^\+?1?\d{9,15}$";
    return Regex.IsMatch(telefono, patron);
}

// Uso de la función
string telefono = "+12345678901";
if (ValidarTelefono(telefono))
{
    Console.WriteLine("Teléfono válido");
}
else
{
    Console.WriteLine("Teléfono inválido");
}

Ejecución del código:

Ejecuta el proyecto de nuevo para ver la validación de teléfono.