Logo Studenta

Programación - CIBERSEGURIDAD CRIPTOGRAFIA 2 integridad y autenticidad de los datos en transito

¡Estudia con miles de materiales!

Vista previa del material en texto

integridad y autenticidad de los datos en tránsito.
Para garantizar la integridad y autenticidad de los datos en tránsito, se utilizan técnicas criptográficas y protocolos de seguridad. Algunos de los métodos comunes incluyen:
Firma digital: Se utiliza para asegurar la integridad y autenticidad de los datos. La firma digital es un valor criptográfico único que se genera utilizando una clave privada y se adjunta a los datos. Al verificar la firma con la clave pública correspondiente, se puede determinar si los datos han sido alterados y si provienen de la entidad autenticada.
aquí tienes un ejemplo en Python utilizando la biblioteca cryptography para generar y verificar una firma digital utilizando RSA:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
# Generar un par de claves RSA
private_key = rsa.generate_private_key(
 public_exponent=65537,
 key_size=2048,
 backend=default_backend()
)
public_key = private_key.public_key()
# Datos a firmar
data = b"Este es el mensaje a firmar"
# Firmar los datos
signature = private_key.sign(
 data,
 padding.PSS(
 mgf=padding.MGF1(hashes.SHA256()),
 salt_length=padding.PSS.MAX_LENGTH
 ),
 hashes.SHA256()
)
# Verificar la firma
try:
 public_key.verify(
 signature,
 data,
 padding.PSS(
 mgf=padding.MGF1(hashes.SHA256()),
 salt_length=padding.PSS.MAX_LENGTH
 ),
 hashes.SHA256()
 )
 print("La firma es válida. Los datos no han sido alterados.")
except:
 print("La firma no es válida. Los datos han sido alterados o la firma no corresponde a la clave pública.")
En este ejemplo, se genera un par de claves RSA: una clave privada (private_key) y una clave pública (public_key). Luego, se define un mensaje (data) que será firmado.
Para firmar los datos, se utiliza la clave privada y el algoritmo de firma PSS (Probabilistic Signature Scheme) con SHA256 como función hash. El resultado es la firma digital (signature).
Para verificar la firma, se utiliza la clave pública y se compara con los datos originales utilizando el mismo algoritmo de firma y función hash. Si la verificación es exitosa, significa que la firma es válida y los datos no han sido alterados. En caso contrario, la firma no es válida y los datos pueden haber sido modificados o la clave pública no corresponde a la firma.
Es importante destacar que este es solo un ejemplo básico para ilustrar el proceso de firma digital con RSA. En un entorno real, se deben considerar otros aspectos como la gestión de claves, la seguridad de almacenamiento de claves y la elección adecuada de algoritmos y parámetros.
Hash criptográfico: Un hash criptográfico es una función que toma los datos de entrada y genera un valor de longitud fija que actúa como una "huella digital" única para esos datos. Cualquier cambio en los datos, por mínimo que sea, producirá un hash completamente diferente. Al comparar el hash recibido con el hash calculado, se puede verificar la integridad de los datos.
aquí tienes un ejemplo en Python utilizando la biblioteca hashlib para calcular un hash criptográfico utilizando el algoritmo SHA-256:
import hashlib
# Datos a calcular el hash
data = b"Este es el mensaje para calcular el hash"
# Crear un objeto de hash
hash_object = hashlib.sha256()
# Actualizar el hash con los datos
hash_object.update(data)
# Obtener el valor del hash en hexadecimal
hash_value = hash_object.hexdigest()
# Imprimir el valor del hash
print("Hash SHA-256:", hash_value)
En este ejemplo, se define un mensaje (data) al cual se le calculará el hash.
Se crea un objeto de hash utilizando el algoritmo SHA-256 mediante hashlib.sha256(). Luego, se actualiza el objeto de hash con los datos utilizando el método update(). Puedes llamar a update() varias veces si necesitas calcular el hash de múltiples bloques de datos.
Finalmente, se obtiene el valor del hash en formato hexadecimal utilizando el método hexdigest(), y se imprime en la salida.
El algoritmo SHA-256 genera un hash de 256 bits, que se representa como una cadena de 64 caracteres hexadecimales. Cualquier cambio en los datos resultará en un valor de hash completamente diferente.
Es importante tener en cuenta que existen otros algoritmos de hash criptográficos disponibles, como SHA-1, SHA-512, MD5, entre otros. La elección del algoritmo depende de los requisitos de seguridad y del contexto de uso.
Certificados digitales: Los certificados digitales son documentos electrónicos utilizados para autenticar la identidad de una entidad en línea. Estos certificados contienen información como el nombre de la entidad, su clave pública y la firma digital de una autoridad de certificación confiable. Al verificar la firma del certificado con la clave pública correspondiente, se puede confirmar la autenticidad de la entidad.
aquí tienes un ejemplo de cómo utilizar certificados digitales en Python utilizando la biblioteca cryptography:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
# Cargar el certificado desde un archivo
with open('certificado.pem', 'rb') as cert_file:
 cert_data = cert_file.read()
# Decodificar el certificado
cert = x509.load_pem_x509_certificate(cert_data, default_backend())
# Obtener información del certificado
subject = cert.subject
issuer = cert.issuer
not_before = cert.not_valid_before
not_after = cert.not_valid_after
serial_number = cert.serial_number
# Imprimir la información del certificado
print("Sujeto:", subject)
print("Emisor:", issuer)
print("Válido desde:", not_before)
print("Válido hasta:", not_after)
print("Número de serie:", serial_number)
# Exportar la clave pública del certificado
public_key = cert.public_key().public_bytes(
 encoding=serialization.Encoding.PEM,
 format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# Imprimir la clave pública
print("Clave pública:")
print(public_key.decode())
En este ejemplo, se carga un certificado digital desde un archivo en formato PEM (Privacy Enhanced Mail). Luego, se decodifica el certificado utilizando la función load_pem_x509_certificate() de la biblioteca cryptography.
A continuación, se obtiene información del certificado como el sujeto, el emisor, la fecha de validez y el número de serie. Esta información puede ser útil para verificar la autenticidad del certificado.
Además, se exporta la clave pública del certificado utilizando el método public_bytes() con el formato PEM. Esto permite obtener la clave pública para su posterior uso, por ejemplo, en operaciones de verificación de firma o encriptación.
Finalmente, se imprime la información del certificado y la clave pública.
Es importante tener en cuenta que este ejemplo asume que tienes un certificado en formato PEM y que estás utilizando la biblioteca cryptography. Los detalles de implementación pueden variar según el formato del certificado y la biblioteca criptográfica que estés utilizando.
Protocolos de seguridad de transporte: Algunos protocolos de seguridad de transporte, como SSL/TLS (Secure Sockets Layer/Transport Layer Security), se utilizan para proporcionar una comunicación segura y cifrada entre un cliente y un servidor. Estos protocolos garantizan la integridad y autenticidad de los datos mediante el uso de cifrado simétrico y asimétrico, así como certificados digitales.
aquí tienes un ejemplo de cómo utilizar el protocolo SSL/TLS en Python utilizando la biblioteca ssl:
import ssl
import socket
# Crear un socket seguro
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
with socket.create_connection(('www.example.com', 443)) as sock:
 with context.wrap_socket(sock, server_hostname='www.example.com') as ssock:
 # Enviar y recibir datos de manera segura
 ssock.sendall(b'GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n')
 response = ssock.recv(4096)
 print(response.decode())En este ejemplo, se crea un socket seguro utilizando el protocolo SSL/TLS a través de la función create_default_context() de la biblioteca ssl. Se especifica ssl.Purpose.SERVER_AUTH como el propósito del contexto, que indica que el socket será utilizado para autenticar el servidor.
Luego, se crea una conexión a través del socket seguro utilizando socket.create_connection() y se envuelve con el contexto seguro utilizando context.wrap_socket(). Se especifica el nombre del servidor (server_hostname) para realizar la verificación de certificados durante el handshake.
Una vez establecida la conexión segura, se pueden enviar y recibir datos de manera segura a través del socket seguro. En este ejemplo, se envía una solicitud HTTP GET al servidor y se recibe la respuesta.
Es importante tener en cuenta que este es solo un ejemplo básico de cómo utilizar el protocolo SSL/TLS en Python. En un escenario real, es necesario considerar aspectos como la validación del certificado del servidor, el manejo de errores y la configuración de opciones de seguridad adicionales según los requisitos específicos de la aplicación.
Estas técnicas y protocolos se utilizan en combinación para garantizar la integridad y autenticidad de los datos en tránsito. Proporcionan mecanismos para detectar cualquier manipulación de los datos y asegurarse de que provienen de la entidad esperada.

Continuar navegando