crypt es una función de biblioteca POSIX C. Por lo general, se usa para calcular el hash de las contraseñas de las cuentas de usuario. La función genera una cadena de texto que también codifica la sal (normalmente los dos primeros caracteres son la sal en sí y el resto es el resultado hash) e identifica el algoritmo hash utilizado (por defecto, el "tradicional" que se explica a continuación). Esta cadena de salida forma un registro de contraseña, que generalmente se almacena en un archivo de texto.
Más formalmente, crypt proporciona funciones de derivación de claves criptográficas para la validación y el almacenamiento de contraseñas en sistemas Unix.
Relación con la utilidad de cifrado de Unix
Existe una utilidad de cifrado no relacionada en Unix, que a menudo se confunde con la función de biblioteca C. Para distinguir entre los dos, los escritores a menudo se refieren al programa de utilidad como crypt (1) , porque está documentado en la sección 1 de las páginas del manual de Unix , y se refieren a la función de la biblioteca C como crypt (3) , porque su documentación está en sección 3 del manual [1]
Detalles
Esta misma función de cripta se utiliza tanto para generar un nuevo hash para el almacenamiento como también para hacer hash de una contraseña ofrecida con una sal registrada para comparar.
Las implementaciones modernas de Unix de la rutina de la biblioteca de criptas admiten una variedad de esquemas hash. El algoritmo hash particular utilizado se puede identificar mediante un prefijo de código único en el texto hash resultante, siguiendo un estándar de facto llamado Modular Crypt Format. [2] [3] [4]
La crypt()
función de biblioteca también está incluida en los lenguajes de programación Perl , [5] PHP , [6] Pike , [7] Python , [8] y Ruby [9] .
Funciones de derivación de claves compatibles con crypt
Con el tiempo se han introducido varios algoritmos. Para habilitar la compatibilidad con versiones anteriores , cada esquema comenzó a usar alguna convención de serialización de los hashes de contraseña que luego se denominó Formato de Cripta Modular (MCF). [3] Los hash de cripta (3) antiguos generados antes del estándar MCF de facto pueden variar de un esquema a otro. Se creó un subconjunto bien definido del formato de cripta modular durante la competencia de hash de contraseñas . [3] El formato se define como: [10]
$
dónde
id
: un identificador que representa el algoritmo hash (como 1 para MD5 , 5 para SHA-256, etc.)param
nombre y suvalue
: parámetros de complejidad hash, como el recuento de rondas / iteracionessalt
: Sal codificada similar a Base64hash
: Resultado codificado similar a Base64 de hash de la contraseña y la sal
ID de esquema | Esquema | Ejemplo |
---|---|---|
DES | Kyq4bCxAXJkbg | |
_ | BSDi | _EQ0.jzhSVeUyoSqLupI |
1 | MD5 | $1$etNnh7FA$OlM7eljE/B7F1J4XYNnk81 |
2 , 2a , 2x , 2 años | bcrypt | $2a$10$VIhIOofSMqgdGlL4wzE//e.77dAQGqntF/1dT7bqCrVtquInWy2qi |
3 | NTHASH | $3$$8846f7eaee8fb117ad06bdd830b7586c |
5 | SHA-256 | $5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD |
6 | SHA-512 | $6$qoE2letU$wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q/6Xscao0 |
md5 | Solaris MD5 | $md5,rounds=5000$GUBv0xjJ$$mSwgIswdjlTY0YxV7HBVm0 |
sha1 | PBKDF1 con SHA-1 | $sha1$40000$jtNX3nZ2$hBNaIXkt4wBI2o5rsi8KejSjNqIq |
El subconjunto PHC cubre la mayoría de los valores hash de MCF. Existen varios métodos adicionales definidos por la aplicación. [3]
Implementación original usando la contraseña como clave
La implementación original de la función de biblioteca crypt () [11] en la Tercera Edición Unix [12] imitaba la máquina de cifrado M-209 . En lugar de cifrar la contraseña con una clave, lo que habría permitido recuperar la contraseña del valor cifrado y la clave, utilizó la propia contraseña como clave, y la base de datos de contraseñas contenía el resultado de cifrar la contraseña con esta clave.
Esquema tradicional basado en DES
Se descubrió que el esquema de cifrado de contraseñas original era demasiado rápido y, por lo tanto, estaba sujeto a la enumeración por fuerza bruta de las contraseñas más probables. [11] En la séptima edición de Unix , [13] el esquema se cambió a una forma modificada del algoritmo DES . Un objetivo de este cambio era hacer que el cifrado fuera más lento. Además, el algoritmo incorporó una sal de 12 bits para garantizar que un atacante se vea obligado a descifrar cada contraseña de forma independiente en lugar de poder apuntar a toda la base de datos de contraseñas simultáneamente.
En detalle, la contraseña del usuario se trunca a ocho caracteres, y estos se reducen a solo 7 bits cada uno; esto forma la clave DES de 56 bits. Luego, esa clave se utiliza para cifrar un bloque de todos los bits cero, y luego el texto cifrado se vuelve a cifrar con la misma clave, y así sucesivamente para un total de 25 cifrados DES. Se usa un salt de 12 bits para perturbar el algoritmo de cifrado, por lo que las implementaciones DES estándar no se pueden usar para implementar crypt (). La sal y el texto cifrado final se codifican en una cadena imprimible en forma de base64 .
Técnicamente, esto no es encriptación ya que los datos (todos los bits cero) no se mantienen en secreto; es ampliamente conocido por todos de antemano. Sin embargo, una de las propiedades de DES es que es muy resistente a la recuperación de claves incluso en situaciones conocidas de texto sin formato . En teoría, es posible que dos contraseñas diferentes den como resultado exactamente el mismo hash. Por lo tanto, la contraseña nunca se "descifra": simplemente se usa para calcular un resultado, y se presume que los resultados coincidentes son una prueba de que las contraseñas eran "las mismas".
Las ventajas de este método han sido que el texto hash se puede almacenar y copiar entre sistemas Unix sin exponer la contraseña de texto plano correspondiente a los administradores del sistema u otros usuarios. Esta portabilidad ha funcionado durante más de 30 años en muchas generaciones de arquitectura informática y en muchas versiones de Unix de muchos proveedores.
Debilidades del esquema tradicional
El tradicional basado en DES cripta algoritmo fue elegido originalmente debido DES era resistente a la recuperación de claves, incluso en la cara de los ataques de texto plano "conocido", y porque era costoso computacionalmente. En las primeras máquinas Unix, se tardaba más de un segundo en calcular un hash de contraseña. Esto también lo hizo razonablemente resistente a los ataques de diccionario en esa época. En ese momento, los hashes de contraseña se almacenaban comúnmente en un archivo de cuenta ( /etc/passwd
) que era legible para cualquiera en el sistema. (Este archivo de cuenta también se utilizó para asignar números de identificación de usuario a nombres y nombres de usuario a nombres completos, etc.).
En las tres décadas transcurridas desde entonces, las computadoras se han vuelto mucho más poderosas. En general, la ley de Moore se ha cumplido, por lo que la velocidad y la capacidad disponibles para una determinada inversión financiera se han duplicado más de 20 veces desde que se escribió Unix por primera vez. Esto ha dejado al algoritmo basado en DES vulnerable desde hace mucho tiempo a los ataques de diccionario, y los sistemas Unix y similares a Unix como Linux han usado archivos "sombra" durante mucho tiempo, migrando solo los valores hash de contraseña fuera del archivo de cuenta ( /etc/passwd
) y en un archivo (con nombre convencional /etc/shadow
) que solo pueden leer los procesos con privilegios.
Para aumentar el costo computacional de la ruptura de contraseñas, algunos sitios Unix comenzaron a aumentar de forma privada el número de rondas de cifrado de forma ad hoc. [ cita requerida ] Esto tuvo el efecto secundario de hacerlos crypt()
incompatibles con el estándar crypt()
: los hashes tenían la misma forma textual, pero ahora se calcularon usando un algoritmo diferente. Algunos sitios también se aprovecharon de este efecto de incompatibilidad, modificando el bloque inicial del estándar de todos-bits-cero. [ cita requerida ] Esto no incrementó el costo del hash, pero significó que los diccionarios hash precalculados basados en el estándar crypt () no pudieron ser aplicados.
Esquema basado en DES extendido BSDi
BSDi utilizó una ligera modificación del esquema clásico basado en DES. BSDi extendió la sal a 24 bits e hizo variable el número de rondas (hasta 2 24 -1). El número de rondas elegido se codifica en el hash de contraseña almacenado, evitando la incompatibilidad que se produjo cuando los sitios modificaron el número de rondas utilizado por el esquema original. Estos hash se identifican comenzando con un guión bajo ( _
), seguido de 4 bytes que representan el número de rondas.
El algoritmo BSDi también admite contraseñas más largas, utilizando DES para reducir la contraseña larga inicial a los ocho bytes de 7 bits admitidos por el algoritmo original.
Esquema basado en MD5
Poul-Henning Kamp diseñó un algoritmo barroco y (en ese momento) computacionalmente costoso basado en el algoritmo de resumen de mensajes MD5 . MD5 en sí mismo proporcionaría una buena solidez criptográfica para el hash de la contraseña, pero está diseñado para ser bastante rápido de calcular en relación con la solidez que proporciona. El esquema crypt () está diseñado para ser costoso de calcular, para ralentizar los ataques de diccionario. La forma imprimible de los hash de contraseña MD5 comienza con $1$
.
Este esquema permite a los usuarios tener una contraseña de cualquier longitud y pueden usar cualquier carácter compatible con su plataforma (no solo ASCII de 7 bits). (En la práctica, muchas implementaciones limitan la longitud de la contraseña, pero generalmente admiten contraseñas mucho más largas de lo que cualquier persona estaría dispuesta a escribir). La sal también es una cadena arbitraria, limitada solo por consideraciones de juego de caracteres.
Primero, la frase de contraseña y la sal se combinan con un hash, produciendo un resumen de mensaje MD5. Luego se construye un nuevo resumen, mezclando la frase de contraseña, la sal y el primer resumen, todo en una forma bastante compleja. Luego, este resumen se pasa a través de mil iteraciones de una función que lo repite junto con la frase de contraseña y la sal de una manera que varía entre rondas. La salida de la última de estas rondas es el hash de la frase de contraseña resultante.
El recuento fijo de iteraciones ha provocado que este esquema pierda el gasto computacional que antes disfrutaba y ahora se favorece el número variable de rondas. En junio de 2012, Poul-Henning Kamp declaró que el algoritmo era inseguro y alentó a los usuarios a migrar a codificadores de contraseñas más seguros. [14]
Esquema basado en Blowfish
Niels Provos y David Mazières diseñado un esquema crypt () llamada bcrypt basado en Blowfish , y lo presentó en USENIX en 1999. [15] La forma imprimible de estos hashes comienza con $2$
, $2a$
, $2b$
, $2x$
o $2y$
dependiendo de la que se utiliza la variante del algoritmo:
$2$
- Obsoleto.$2a$
- La clave actual utilizada para identificar este esquema. Desde que se descubrió una falla de seguridad importante en 2011 en un sistema que no es OpenBSD crypt_blowfish implementación del algoritmo, [16] hashes indicados por esta cadena ahora son ambiguos y podrían haber sido generados por la implementación defectuosa, o una implementación subsiguiente fija. La falla puede ser provocada por algunas cadenas de contraseña que contienen caracteres no ASCII (conjunto de 8 bits).$2b$
- Utilizado por implementaciones recientes de OpenBSD para incluir una mitigación a un problema envolvente. [17] Las versiones anteriores del algoritmo tienen un problema con las contraseñas largas. Por diseño, las contraseñas largas se truncan a los 72 caracteres, pero existe un problema de envoltura de bytes enteros con ciertas longitudes de contraseña que dan como resultado hash débiles. [18]$2x$
- Una bandera añadida después de la descubrimiento de errores de crypt_blowfish . Se puede cambiar el nombre de los hash antiguos$2x$
para indicar que se generaron con el algoritmo roto. Estos hash aún son débiles, pero al menos está claro qué algoritmo se utilizó para generarlos.$2y$
- Una bandera en crypt_blowfish para utilizar sin ambigüedades el nuevo algoritmo corregido. En una implementación anterior que sufre el error,$2y$
simplemente no funcionará. En una implementación fija más nueva, producirá el mismo resultado que usar$2a$
.
Blowfish es notable entre los cifrados de bloque por su costosa fase de configuración de claves. Comienza con subclaves en un estado estándar, luego usa este estado para realizar un cifrado de bloque usando parte de la clave, y usa el resultado de ese cifrado (en realidad, un hash) para reemplazar algunas de las subclaves. Luego usa este estado modificado para encriptar otra parte de la clave y usa el resultado para reemplazar más subclaves. Procede de esta manera, usando un estado progresivamente modificado para codificar la clave y reemplazar bits de estado, hasta que se hayan establecido todas las subclaves.
El número de rondas de codificación es una potencia de dos, que es una entrada para el algoritmo. El número está codificado en el hash textual, p. Ej.$2y$10...
Esquema de hash NT
FreeBSD implementó soporte para el algoritmo hash de NT LAN Manager para proporcionar una compatibilidad más fácil con cuentas NT a través de MS-CHAP . [19] Se sabe que el algoritmo NT-Hash es débil, ya que utiliza el obsoleto algoritmo hash md4 sin ningún tipo de sal . [20] FreeBSD usó el $3$
prefijo para esto. No se recomienda su uso, ya que se rompe fácilmente. [1]
Esquema basado en SHA2
El esquema basado en MD5 de uso común se ha vuelto más fácil de atacar a medida que ha aumentado la potencia de la computadora. Aunque el sistema basado en Blowfish tiene la opción de agregar rondas y, por lo tanto, sigue siendo un algoritmo de contraseña desafiante, no utiliza un algoritmo aprobado por NIST . A la luz de estos hechos, Ulrich Drepper de Red Hat lideró un esfuerzo para crear un esquema basado en las funciones hash SHA-2 (SHA-256 y SHA-512). [21] La forma imprimible de estos hash comienza con $5$
(para SHA-256) o $6$
(para SHA-512) según la variante de SHA que se utilice. Su diseño es similar al de la cripta basada en MD5, con algunas diferencias notables: [21]
- Evita agregar datos constantes en unos pocos pasos.
- El algoritmo MD5 agregaría repetidamente la primera letra de la contraseña; [ cita requerida ] este paso se modificó significativamente.
- Inspirado por la implementación crypt () de Sun, se agregó la funcionalidad para especificar el número de iteraciones (rondas) que realiza el bucle principal en el algoritmo [22] [23]
- El número de iteraciones es 5000 de forma predeterminada, con un mínimo de 1000 y un máximo de 999,999,999. [24]
La especificación y el código de muestra se han publicado en el dominio público; a menudo se denomina "SHAcrypt". [24]
Soporte en sistemas operativos
ID de esquema | Esquema | Linux ( glibc ) | FreeBSD | NetBSD | OpenBSD | Solaris | Mac OS |
---|---|---|---|---|---|---|---|
DES | sí | sí | sí | sí | sí | sí | |
_ | BSDi | No | sí | sí | sí | No | sí |
1 | MD5 | sí | sí | sí | sí | sí | No |
2, 2a, 2x, 2 años | bcrypt | No | sí | sí | sí | sí | No |
3 | NTHASH | No | sí | No | No | No | No |
5 | SHA-256 | 2.7+ | 8,3+ | No | No | sí | No |
6 | SHA-512 | 2.7+ | 8,3+ | No | No | sí | No |
md5 | Solaris MD5 | No | No | No | No | sí | No |
sha1 | PBKDF1 con SHA1 | No | No | sí | No | No | No |
Esquemas arcaicos de Unix
BigCrypt es la versión modificada de DES-Crypt utilizada en HP-UX, Digital Unix y OSF / 1. La principal diferencia entre este y DES es que BigCrypt usa todos los caracteres de una contraseña, no solo los primeros 8, y tiene un hash de longitud variable. [25]
Crypt16 es la modificación menor de DES, que permite contraseñas de hasta 16 caracteres. Usado en Ultrix y Tru64. [26]
Linux
La biblioteca GNU C utilizada por casi todas las distribuciones de Linux proporciona una implementación de la función crypt que admite los algoritmos hash basados en DES, MD5 y (desde la versión 2.7) SHA-2 mencionados anteriormente. Ulrich Drepper, el mantenedor de glibc, rechazó el soporte de bcrypt (esquema 2) ya que no está aprobado por NIST . [27] Una biblioteca crypt_blowfish de dominio público está disponible para sistemas sin bcrypt. Se ha integrado en glibc en SUSE Linux . [28]
La biblioteca musl C admite los esquemas 1, 2, 5 y 6, además del esquema tradicional DES. El código DES tradicional se basa en BSD FreeSec , con modificaciones para que sea compatible con glibc UFC-Crypt . [29]
Mac OS
El nativo de Darwin crypt()
proporciona una funcionalidad limitada, y solo admite DES y BSDi. OS X usa algunos sistemas para sus propios hashes de contraseñas, que van desde el antiguo NeXTStep netinfo hasta el nuevo sistema de servicios de directorio (ds). [30] [31]
Ver también
- Función de derivación clave
- Sal (criptografía)
Referencias
- ^ a b - Manual de funciones de la biblioteca FreeBSD
- ^ Simson Garfinkel, Alan Schwartz, Gene Spafford. "Práctica Unix y seguridad en Internet" . 2003. apartado "4.3.2.3 crypt16 (), DES extendido y formato de cripta modular" . "El formato de cripta modular (MCF) especifica un esquema extensible para formatear contraseñas cifradas. MCF es uno de los formatos más populares para contraseñas cifradas"
- ^ a b c d "Formato de cripta modular - Documentación de Passlib v1.7.1" . Pythonhosted.org . Consultado el 2 de diciembre de 2018 .
- ^ "ademarre / binary-mcf" . GitHub.com . Consultado el 2 de diciembre de 2018 .
- ^ "cripta - perldoc.perl.org" . Perldoc.perl.org . Consultado el 2 de diciembre de 2018 .
- ^ "PHP: cripta - Manual" . Us.php.net . Consultado el 2 de diciembre de 2018 .
- ^ "cripta ()" . Archivado desde el original el 2 de octubre de 2012 . Consultado el 9 de febrero de 2013 .
- ^ "crypt - Función para comprobar las contraseñas de Unix - Documentación de Python 3.7.1" . Docs.python.org . Consultado el 2 de diciembre de 2018 .
- ^ "Clase: String (Ruby 2.5.3)" . Ruby-doc.org . Consultado el 2 de diciembre de 2018 .
- ^ Concurso de hash de contraseñas. "Formato de cadena PHC" . Github .
- ^ a b Morris, Robert; Thompson, Ken (3 de abril de 1978). "Seguridad de contraseña: historia de un caso" . Bell Laboratories . Consultado el 17 de diciembre de 2013 .
- ^ "cifrado - codificación de contraseña" . UNIX Third Edition Programmers 'Manual . 1973-01-15.
- ^ "crypt, setkey, encrypt - cifrado DES" . Manual del programador de UNIX séptima edición . 1979.
- ^ "El codificador de contraseñas Md5crypt ya no es considerado seguro por el autor - PHKs Bikeshed" . Phk.freebsd.dk . Archivado desde el original el 17 de marzo de 2018 . Consultado el 2 de diciembre de 2018 .
- ^ Provos, Niels; Mazières, David (1999). "Un esquema de contraseña adaptable al futuro" . Actas de la Conferencia Técnica Anual de USENIX de 1999 : 81–92.
- ^ Diseñador, Solar (2011-06-21). "crypt_blowfish 1.1; Actualización de seguridad de Owl glibc" .Ver también CVE - 2011-2483 .
- ^ "src / lib / libc / crypt / bcrypt.c - ver - 1.27" . Cvsweb.openbsd.org . Consultado el 14 de mayo de 2016 .
- ^ Diseñador, Solar (2012-01-02). "OpenBSD bcrypt key_len envolvente de 8 bits" .
- ^ "Hash de contraseña NT MD4 como nuevo método de cifrado de contraseña para FreeBSD" . Mail-archive.com . Consultado el 2 de diciembre de 2018 .
- ^ "El proveedor de soporte de seguridad y protocolo de autenticación NTLM" . Davenport.sourceforge.net . Consultado el 2 de diciembre de 2018 .
- ^ a b Drepper, Ulrich (19 de septiembre de 2007). "Cripta Unix con SHA-256/512" . Consultado el 21 de noviembre de 2018 .
- ^ Sun Microsystems. "página de manual de crypt_sunmd5 (5)" . Archivado desde el original el 16 de abril de 2008 . Consultado el 5 de marzo de 2008 .
- ^ Muffett, Alec (5 de diciembre de 2005). "OpenSolaris, Pluggable Crypt y el algoritmo de hash de contraseña SunMD5" . Consultado el 11 de agosto de 2012 .
- ^ a b Drepper, Ulrich. "Cripta Unix usando SHA-256 y SHA-512" .
- ^ "passlib.hash.bigcrypt - BigCrypt - Documentación de Passlib v1.7.1" . Pythonhosted.org . Consultado el 2 de diciembre de 2018 .
- ^ "passlib.hash.crypt16 - Crypt16 - Documentación de Passlib v1.7.1" . Pythonhosted.org . Consultado el 2 de diciembre de 2018 .
- ^ "Soporte de bcrypt para contraseñas en / etc / shadow - Portal del cliente de Red Hat" . Access.redhat.com . Consultado el 2 de diciembre de 2018 .
- ^ "hash de contraseña bcrypt (" cifrado de contraseña ") para su software y sus servidores" . www.openwall.com .
- ^ "crypt_r.c \ crypt \ src - musl - musl - una implementación de la biblioteca estándar para sistemas basados en Linux" . git.musl-libc.org .
- ^ "Cómo Mac OS X implementa la autenticación de contraseña" . Dribin.org . Consultado el 2 de diciembre de 2018 .
- ^ "Cómo descifrar las contraseñas de Mac OS X - Online Hash Crack" . Onlinehashcrack.com . Consultado el 2 de diciembre de 2018 .
enlaces externos
- Código fuente para crypt (3) de Seventh Edition Unix (implementa DES propuesto)
- Cadenas de codificación hash de contraseña de muestra
- Implementación de la cripta .NET