Skip to content

Repositorio con ejemplos haciendo uso de la librería Cryptography

Notifications You must be signed in to change notification settings

alakifan/Cryptography

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Cryptography

Qué es y para qué sirve

 Cryptography es un paquete que provee de primitivas criptográficas (algoritmos criptográficos de bajo nivel) a desarrolladores Python para añadir seguridad a sus programas. Aspira a ser la librería estándar de criptografía.

Instalación

Es muy simple, se puede hacer con pip con el comando:

$ pip install cryptography

Disposición

Cryptography está dividido en dos niveles, uno con fórmulas criptográficas de fácil uso que prácticamente no requieren que el desarrollador tome muchas decisiones, y otro con primitivas criptográficas de bajo nivel. Estas suelen ser peligrosas y pueden ser usadas incorrectamente. Requieren toma de decisiones y un conocimiento profundo en el campo de la criptografía. Debido al potencial peligro que suponen, nos referimos a ellas como el nivel de "Materiales peligrosos".

Principales módulos

Fernet

Fernet es un módulo de criptografía simétrica. Garantiza que un mensaje encriptado con este módulo no pueda ser manipulado o leído sin la key.

>>> from cryptography.fernet import Fernet
>>> key = Fernet.generate_key()
>>> f = Fernet(key)
>>> token = f.encrypt(b"my deep dark secret")
>>> token
'...'
>>> f.decrypt(token)
'my deep dark secret'

También soporta la rotación de keys mediante MultiFernet.

>>> from cryptography.fernet import Fernet, MultiFernet
>>> key1 = Fernet(Fernet.generate_key())
>>> key2 = Fernet(Fernet.generate_key())
>>> f = MultiFernet([key1, key2])
>>> token = f.encrypt(b"Secret message!")
>>> token
'...'
>>> f.decrypt(token)
'Secret message!'

Es posible usar contraseñas con Fernet pasándolas por funciones como PBKDF2, o Scrypt

La principal limitación de Fernet es su dificultad a la hora de securizar grandes archivos.

X.509

Los certificados X.509 se usan para autentificar clientes y servidores. Normalmente para servidores que usan HTTPS.

Crear una solicitud de firma de certificado (CSR)

El CSR es un mensaje enviado por un solicitante a una autoridad de certificación, para solicitar un certificado digital. Normalmente contiene la clave pública mediante la cual se referirá al certificado, información identificativa (como el nombre del dominio), o protección de integridad (como la firma digital).

Para obtenerlo, los pasos a seguir suelen ser:

  1. Generar una clave privada y una pública
  2. Crear una petición para un certificado, que va firmado por tu clave para demostrar que te pertenece
  3. Entregar el certificado a la autoridad de certificación (SOLO con la pública)
  4. La autoridad reconoce que te pertenece el recurso para el que quieres el certificado
  5. La autoridad te da el certificado firmado por ellos, que identifica tu clave pública y el recurso que has autenticado
  6. Configuras tu servidor para usar ese certificado, combinado con tu clave privada para el tráfico del servidor

El código para generar la key privada es el siguiente:

>>> from cryptography.hazmat.backends import default_backend
>>> from cryptography.hazmat.primitives import serialization
>>> from cryptography.hazmat.primitives.asymmetric import rsa
>>> # Generate our key
>>> key = rsa.generate_private_key(
... public_exponent=65537,
... key_size=2048,
... backend=default_backend()
... )
>>> # Write our key to disk for safe keeping
>>> with open("path/to/store/key.pem", "wb") as f:
... f.write(key.private_bytes(
... encoding=serialization.Encoding.PEM,
... format=serialization.PrivateFormat.TraditionalOpenSSL,
... encryption_algorithm=serialization.BestAvailableEncryption(b"passphrase"),
... ))

Para la petición de la firma del certificado necesitamos escribir el siguiente código con algunos detalles como nuestra clave pública, información sobre nosotros, e información para qué dominios es el certificado.

>>> from cryptography import x509
>>> from cryptography.x509.oid import NameOID
>>> from cryptography.hazmat.primitives import hashes
>>> # Generate a CSR
>>> csr = x509.CertificateSigningRequestBuilder().subject_name(x509.Name([
... # Provide various details about who we are.
... x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
... x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"CA"),
... x509.NameAttribute(NameOID.LOCALITY_NAME, u"San Francisco"),
... x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"My Company"),
... x509.NameAttribute(NameOID.COMMON_NAME, u"mysite.com"),
... ])).add_extension(
... x509.SubjectAlternativeName([
... # Describe what sites we want this certificate for.
... x509.DNSName(u"mysite.com"),
... x509.DNSName(u"www.mysite.com"),
... x509.DNSName(u"subdomain.mysite.com"),
... ]),
... critical=False,
... # Sign the CSR with our private key.
... ).sign(key, hashes.SHA256(), default_backend())
>>> # Write our CSR out to disk.
>>> with open("path/to/csr.pem", "wb") as f:
... f.write(csr.public_bytes(serialization.Encoding.PEM))

Ya solo quedaría dar nuestra petición a la autoridad de certificación para que nos devuelva el certificado.

Otras funciones

Lo que viene aquí corresponde al módulo de "Materiales peligrosos". SOLO debe usarse si se está seguro al 100% de lo que se está haciendo, porque este módulo (según su página web oficial), está lleno de "minas, dragones, y dinosaurios con pistolas láser".

Primitivos

Son algoritmos de bajo nivel usados para construir protocolos criptográficos para sistemas de seguridad informática.

Excepciones

Este módulo cuenta con distintas excepciones como "UnsupportedAlgorithm", que se le llama cuando un algoritmo no es soportado por Cryptography, "AlreadyFinalized", para cuando se usa un contexto ya finalizado, "InvalidSignature", cuando la verificación de la firma digital falla, y algunas más

Generación de números aleatorios

Cuando se generan datos aleatorios para usar en operaciones criptográficas, no es recomendable usar un módulo "random" estándar, ya que no tienen un generador de números aleatorios securizado criptográficamente. Por lo tanto, se recomienda el uso del generador de números aleatorios del propio sistema operativo "os.urandom()"

Backends

Cryptography fue diseñado para soportar múltiples backends, pero actualmente este diseño ha sido deprecado. Se puede obtener el backend por defecto llamando a "default_backend()"

Proyecto

Ejemplo simple

https://pastebin.com/iRdzYJGT

Ejemplo contraseñas

https://pastebin.com/bmrisiii

About

Repositorio con ejemplos haciendo uso de la librería Cryptography

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages