Documentos de Académico
Documentos de Profesional
Documentos de Cultura
criptográfico
Introducción
Este artículo proporciona un modelo simple a seguir al implementar soluciones
para proteger los datos en reposo.
Diseño arquitectonico
El primer paso en el diseño de cualquier aplicación es considerar la
arquitectura general del sistema, ya que esto tendrá un gran impacto en la
implementación técnica.
A nivel de aplicación.
En el nivel de la base de datos (por ejemplo, SQL Server TDE
En el nivel del sistema de archivos (por ejemplo, BitLocker o LUKS)
A nivel de hardware (p. Ej., Tarjetas RAID cifradas o SSD)
Las capas más apropiadas dependerán del modelo de amenaza. Por ejemplo,
el cifrado a nivel de hardware es efectivo para proteger contra el robo físico
del servidor, pero no proporcionará protección si un atacante puede
comprometer el servidor de forma remota.
Minimice el almacenamiento de información
confidencial
La mejor manera de proteger la información confidencial es no almacenarla en
primer lugar. Aunque esto se aplica a todo tipo de información, con mayor
frecuencia se aplica a los detalles de la tarjeta de crédito, ya que son muy
deseables para los atacantes, y PCI DSS tiene requisitos tan estrictos sobre
cómo deben almacenarse. Siempre que sea posible, se debe evitar el
almacenamiento de información confidencial.
Algoritmos
Para el cifrado simétrico, AES con una clave de al menos 128
bits (idealmente 256 bits ) y un modo seguro debe usarse como el algoritmo
preferido.
Tamaño clave
Ataques conocidos y debilidades del algoritmo.
Madurez del algoritmo.
Aprobación por parte de terceros, como el programa de validación algorítmica de
NIST .
Rendimiento (tanto para cifrado como descifrado).
Calidad de las bibliotecas disponibles.
Portabilidad del algoritmo (es decir, qué tan ampliamente soportado es).
Algoritmos personalizados
No hagas esto.
Modos de cifrado
Hay varios modos que se pueden usar para permitir que los cifrados de bloque
(como AES) cifren cantidades arbitrarias de datos, de la misma manera que lo
haría un cifrado de flujo. Estos modos tienen diferentes características de
seguridad y rendimiento, y una discusión completa de ellos está fuera del
alcance de esta hoja de trucos. Algunos de los modos tienen requisitos para
generar vectores de inicialización (IV) seguros y otros atributos, pero estos
deben ser manejados automáticamente por la biblioteca.
La siguiente tabla muestra los algoritmos recomendados para cada idioma, así
como las funciones inseguras que no se deben usar.
Funciones criptográficamente
Idioma Funciones inseguras
seguras
random_bytes () , random_int
() en PHP 7
PHP rand(), mt_rand(), array_rand(),uniqid()
o openssl_random_pseudo_bytes
() en PHP 5
.NET /
Random(), RNGCryptoServiceProvider
C#
C
arc4random() (Utiliza RC4 Cipher), SecRandomCopyBytes
objetivo
UUID y GUID
Los identificadores universalmente únicos (UUID o GUID) a veces se usan
como una forma rápida de generar cadenas aleatorias. Aunque pueden
proporcionar una fuente razonable de aleatoriedad, esto dependerá del tipo o
versión del UUID que se cree.
Gestión de claves
Procesos
Los procesos formales deben implementarse (y probarse) para cubrir todos los
aspectos de la gestión de claves, incluidos:
Generación clave
Las claves deben generarse aleatoriamente utilizando una función
criptográficamente segura, como las que se analizan en la sección Generación
segura de números aleatorios . Las claves no deben basarse en palabras o
frases comunes, o en caracteres "aleatorios" generados al machacar el
teclado.
Una vez que se cumple uno de estos criterios, se debe generar una nueva
clave y utilizarla para cifrar cualquier dato nuevo. Hay dos enfoques principales
sobre cómo se deben manejar los datos existentes que se cifraron con las
claves antiguas:
Es importante que el código y los procesos necesarios para rotar una clave
estén en su lugar antes de que sean necesarios, de modo que las claves
puedan rotarse rápidamente en caso de compromiso. Además, los procesos
también deben implementarse para permitir que se modifique el algoritmo de
cifrado o la biblioteca, en caso de que se encuentre una nueva vulnerabilidad
en el algoritmo o la implementación.
Almacenamiento de claves
El almacenamiento seguro de claves criptográficas es uno de los problemas
más difíciles de resolver, ya que la aplicación siempre necesita tener cierto
nivel de acceso a las claves para descifrar los datos. Si bien es posible que no
sea posible proteger completamente las claves de un atacante que haya
comprometido completamente la aplicación, se pueden tomar una serie de
pasos para que sea más difícil obtener las claves.
Para que esto sea efectivo, el KEK debe almacenarse por separado del
DEK. El DEK cifrado se puede almacenar con los datos, pero solo se podrá
utilizar si un atacante también puede obtener el KEK, que se almacena en otro
sistema.
El KEK también debería ser al menos tan fuerte como el DEK. La guía
de cifrado de sobres de Google contiene más detalles sobre cómo administrar
DEK y KEK.
En arquitecturas de aplicaciones más simples (como los entornos de
alojamiento compartido) donde KEK y DEK no se pueden almacenar por
separado, este enfoque tiene un valor limitado, ya que es probable que un
atacante pueda obtener ambas claves al mismo tiempo. Sin embargo, puede
proporcionar una barrera adicional para los atacantes no calificados.
Se podría usar una función de derivación de clave (KDF) para generar un KEK
a partir de la entrada suministrada por el usuario (como una frase de
contraseña), que luego se usaría para cifrar un DEK generado
aleatoriamente. Esto permite que el KEK se cambie fácilmente (cuando el
usuario cambia su frase de contraseña), sin necesidad de volver a cifrar los
datos (ya que el DEK sigue siendo el mismo).