En criptografía, el Mecanismo de autenticación de desafío-respuesta salado ( SCRAM ) es una familia de mecanismos de autenticación de desafío-respuesta modernos y basados en contraseñas que brindan autenticación de un usuario en un servidor. Como se especifica para la Capa de seguridad y autenticación simple (SASL), se puede utilizar para inicios de sesión basados en contraseña en servicios como SMTP e IMAP ( correo electrónico ) o XMPP (chat). Para XMPP, es obligatorio admitirlo. [1]
Motivación
Alice quiere iniciar sesión en el servidor de Bob. Necesita demostrar que es quien dice ser. Para resolver este problema de autenticación, Alice y Bob acordaron una contraseña, que Alice conoce y Bob sabe cómo verificar.
Ahora Alice podía enviar su contraseña a Bob a través de una conexión no cifrada en forma de texto sin cifrar, para que él la verificara. Sin embargo, eso haría que la contraseña fuera accesible para Mallory, que está interviniendo en la línea. Alice y Bob podrían intentar evitar esto cifrando la conexión. Sin embargo, Alice no sabe si el cifrado lo configuró Bob y no Mallory mediante un ataque de intermediario . Por lo tanto, Alice envía una versión hash de su contraseña, como en CRAM-MD5 o DIGEST-MD5 . Como es un hash, Mallory no obtiene la contraseña en sí. Y debido a que el hachís es un desafío, Mallory podría usarlo solo para un proceso de inicio de sesión. Sin embargo, Alice quiere darle información confidencial a Bob y quiere asegurarse de que sea Bob y no Mallory.
Para resolver esto, Bob se ha registrado ante una autoridad de certificación (CA), que firmó su certificado. Alice solo podía confiar en ese sistema de firmas, pero sabe que tiene debilidades . Para darle seguridad adicional de que no hay un ataque de intermediario, Bob crea una prueba de que conoce la contraseña (o un hash de la misma) e incluye su certificado en esta prueba. Esta inclusión se denomina vinculación de canal, ya que el canal de cifrado inferior está "vinculado" al canal de aplicación superior.
Alice entonces tiene una autenticación de Bob y Bob tiene una autenticación de Alice. En conjunto, tienen autenticación mutua . DIGEST-MD5 ya habilitó la autenticación mutua, pero a menudo se implementó incorrectamente. [2]
Cuando Mallory ejecuta un ataque de intermediario y falsifica una firma de CA, podría recuperar un hash de la contraseña. Pero no podía hacerse pasar por Alice ni siquiera para una sola sesión de inicio de sesión, ya que Alice incluyó en su hash la clave de cifrado de Mallory, lo que provocó un error de inicio de sesión de Bob. Para realizar un ataque totalmente transparente, Mallory necesitaría conocer la contraseña utilizada por Alice o la clave de cifrado secreta de Bob.
Bob ha oído hablar de violaciones de datos de las bases de datos del servidor y decidió que no quiere almacenar las contraseñas de sus usuarios en texto sin cifrar. Ha oído hablar de los esquemas de inicio de sesión CRAM-MD5 y DIGEST-MD5, pero sabe que, para ofrecer estos esquemas de inicio de sesión a sus usuarios, tendría que almacenar contraseñas con un hash débil y sin sal. No le gusta la idea y, por lo tanto, elige exigir las contraseñas en texto sin formato. Luego, puede utilizarlos con esquemas de hash seguros como bcrypt , scrypt o PBKDF2 , y agregarlos como desee. Sin embargo, Bob y Alice seguirían enfrentando los problemas descritos anteriormente. Para resolver este problema, usan SCRAM, donde Bob puede almacenar su contraseña en un formato salado, usando PBKDF2. Durante el inicio de sesión, Bob envía a Alice su sal y el recuento de iteraciones del algoritmo PBKDF2, y luego Alice los usa para calcular la contraseña hash que Bob tiene en su base de datos. Todos los cálculos posteriores en SCRAM se basan en este valor que ambos conocen.
Descripción general del protocolo
Aunque todos los clientes y servidores deben admitir el algoritmo hash SHA-1 , SCRAM es, a diferencia de CRAM-MD5 o DIGEST-MD5 , independiente de la función hash subyacente. [3] En su lugar, se pueden utilizar todas las funciones hash definidas por la IANA . Como se mencionó en la sección Motivación, SCRAM utiliza el mecanismo PBKDF2 , que aumenta la fuerza contra los ataques de fuerza bruta , cuando se produce una fuga de datos en el servidor. Sea H
la función hash seleccionada, dada por el nombre del algoritmo anunciado por el servidor y elegido por el cliente. 'SCRAM-SHA-1', por ejemplo, usa SHA-1 como función hash.
Clave derivada basada en contraseña o contraseña salada
El cliente obtiene una clave, o contraseña salada, de la contraseña, una sal y una serie de iteraciones computacionales de la siguiente manera:
SaltedPassword = Hi(password, salt, iteration-count) = PBKDF2(HMAC, password, salt, iteration-count, output length of H)
.
Mensajes
RFC 5802 nombra cuatro mensajes consecutivos entre el servidor y el cliente:
- el cliente primero
- El mensaje del cliente primero consiste en un encabezado GS2 (que comprende un indicador de enlace de canal y un nombre opcional para la información de autorización), el mensaje de cliente deseado
username
y generado aleatoriamentec-nonce
. - servidor primero
- El servidor agrega a este cliente nonce su propio nonce
s-nonce
, y lo agrega al mensaje del servidor primero , que también contiene unsalt
usado por el servidor para salar el hash de la contraseña del usuario, y un recuento de iteracionesiteration-count
. - cliente-final
- Después de que el cliente envía el cliente de final de mensaje que contiene la unión de canal , la cabecera GS2 y canal de datos codificados en base64 de unión, la concatenación del cliente y el nonce servidor, y la prueba cliente,
proof
. - servidor-final
- La comunicación se cierra con el servidor de final de mensaje, que contiene la firma del servidor,
verifier
.
Pruebas
El cliente y el servidor se prueban mutuamente que tienen la misma Auth
variable, que consiste en:
Auth = client-first-without-header + , + server-first + , + client-final-without-proof
(concatenado con comas)
Más concretamente, esto toma la forma:
= r=c‑nonce,[extensions,]r=c‑nonce‖s‑nonce,s=salt,i=iteration‑count,[extensions,]c=base64(channel‑flag,[a=authzid],channel‑binding),r=c‑nonce‖s‑nonce[,extensions]
Las pruebas se calculan de la siguiente manera:
ClientKey = HMAC(SaltedPassword, 'Client Key')
ServerKey = HMAC(SaltedPassword, 'Server Key')
ClientProof = p = ClientKey XOR HMAC(H(ClientKey), Auth)
ServerSignature = v = HMAC(ServerKey, Auth)
donde la operación XOR se aplica a cadenas de bytes de la misma longitud, es un hash normal de . y son cadenas textuales.H(ClientKey)
ClientKey
'Client Key'
'Server Key'
Contraseña almacenada
El servidor almacena sólo el nombre de usuario, salt
, iteration-count
, , . El servidor tiene acceso transitorio a, ya que se recupera de la prueba del cliente, habiendo sido cifrado con .H(ClientKey)
ServerKey
ClientKey
H(ClientKey)
El cliente solo necesita el password
.
Enlace de canal
El término enlace de canal describe la estrategia de prevención de ataques man-in-the-middle para 'enlazar' una capa de aplicación , que proporciona autenticación mutua, a una capa inferior (principalmente cifrado), asegurando que los puntos finales de una conexión sean los mismos en ambos capas. Hay dos direcciones generales para el enlace de canal: enlace de canal único y de punto final . El primero asegura que se utilice una conexión específica, el segundo que los puntos finales sean los mismos.
Hay varios tipos de enlace de canal, donde cada tipo tiene un prefijo único de enlace de canal . [4] Cada tipo de enlace de canal especifica el contenido de los datos de enlace de canal , lo que proporciona información única sobre el canal y los puntos finales. Por ejemplo, para el enlace de canal tls-server-end-point , es el certificado TLS del servidor. [5] Un caso de uso de ejemplo de enlace de canal con SCRAM como capa de aplicación, podría ser con Transport Layer Security (TLS) como capa inferior. Si bien TLS protege de la escucha pasiva, por sí solo no evita los ataques de intermediario. Para esto, los puntos finales deben asegurarse sus identidades entre sí, lo cual es proporcionado por SCRAM.
La variable SCRAM gs2-cbind-flag especifica si el cliente admite el enlace de canal o no, o cree que el servidor no admite el enlace de canal, y c-bind-input contiene el indicador gs2-cbind-flag junto con el prefijo único de enlace de canal y los propios datos de enlace de canal .
El enlace de canal es opcional en SCRAM y la variable gs2-cbind-flag evita los ataques de degradación .
Cuando un servidor admite la vinculación de canales, agrega la secuencia de caracteres '-PLUS' al nombre del algoritmo SCRAM anunciado.
Fortalezas
- Almacenamiento seguro de contraseñas: cuando se implementa de la manera correcta, el servidor puede almacenar las contraseñas en un formato hash iterado y salado , lo que dificulta los ataques fuera de línea y reduce el impacto de las violaciones de la base de datos. [6]
- Sencillez: implementar SCRAM es más fácil [7] que DIGEST-MD5. [8]
- Interoperabilidad internacional: la RFC requiere que se utilice UTF-8 para nombres de usuario y contraseñas, a diferencia de CRAM-MD5. [7] [9]
- Debido a que solo se usa la versión con sal y hash de una contraseña en todo el proceso de inicio de sesión, y la sal en el servidor no cambia, un cliente que almacena contraseñas puede almacenar las versiones con hash y no exponer la contraseña de texto sin cifrar a los atacantes. Dichas versiones hash están vinculadas a un servidor, lo que lo hace útil para la reutilización de contraseñas. [10]
Referencias
- ^ "RFC 6120: Protocolo extensible de mensajería y presencia (XMPP): Núcleo" .
- ^ Kurt Zeilenga (19 de mayo de 2010). "SCRAM en LDAP Mejor autenticación basada en contraseña" (PDF) . Consultado el 24 de enero de 2014 .
- ^ "RFC 5802, sección 4" .
- ^ "RFC 5056 sección-7.1" .
- ^ "RFC 5929 sección 4" .
- ^ "SCRAM: un nuevo protocolo para la autenticación de contraseña" . 19 de mayo de 2010 . Consultado el 24 de enero de 2014 .
- ^ a b Tobias Markmann (2 de diciembre de 2009). "¡Lárgate DIGEST-MD5!" . Consultado el 23 de enero de 2014 .
- ^ "DIGEST-MD5 a histórico" .
- ^ CRAM-MD5 a Histórico
- ^ Tobias Markmann (9 de junio de 2010). "Duerma bien por la noche sabiendo que sus contraseñas son seguras" .
enlaces externos
- RFC 5802, SCRAM para SASL y GSS-API
- RFC 7677, SCRAM-SHA-256 y SCRAM-SHA-256-PLUS
- RFC 7804, SCRAM en HTTP
- Laberinto de seguridad de red GNU (presentación similar a la sección Motivación )