Autenticación estándar OATH.
Iniciativa OATH
La iniciativa OATH (Open Authentication) es una colaboración apoyada por varios miembros de la industria de la seguridad para desarrollar una arquitectura de autenticación fuerte abierta e interoperable. Este objetivo se consigue definiendo normas abiertas a disposición de todos.
El ecosistema OATH está formado por fabricantes de dispositivos (fichas, chips, tarjetas inteligentes, ordenadores, teléfonos móviles, PDA, tabletas), fabricantes de plataformas (servicios web, gestores de identidad, servidores de aplicaciones, sistemas de federación de identificación), fabricantes de aplicaciones (VPN, CRM, ERP, DRM, comercio electrónico, itinerancia, Wi-Fi) e integradores de sistemas (ISP, organismos gubernamentales, marcas de tarjetas de crédito, etc.).
Módulo OATH
El HSM puede utilizarse como generador de semillas OATH y como autenticador OTP (One Time Password). La implementación del HSM cumple las normas que se indican a continuación.
Al proporcionar una frontera criptográfica segura, un entorno controlado y algoritmos aprobados, HSM ofrece ventajas para su adopción en un sistema de autenticación fuerte.
El módulo OATH de HSM dispone de tres servicios básicos: emisión, autenticación y resincronización:
- La emisión consiste en que el HSM genera la semilla, que provoca la emisión de un blob, que se devuelve a la aplicación para su almacenamiento en una base de datos. Con el blob guardado en una base de datos externa al HSM, el proceso de emisión es muy flexible, sin generar una carga en el HSM y manteniendo el secreto y la confidencialidad necesarios.
- El servicio de autenticación del módulo es sin duda el más utilizado en el día a día de la producción. Cuando la aplicación necesita realizar una autenticación, debe recuperar el blob de la base de datos, enviarlo al HSM, recibir el resultado junto con el blob actualizado, para devolverlo a la base de datos.
- el servicio de resincronización consiste básicamente en abrir la ventana normal de tolerancia y pedir al usuario que introduzca los OTP n y n+1.
Escenarios de generación y autenticación
En los escenarios de generación y autenticación que se describen a continuación, lo que cambia es el origen de la semilla y cómo la recibe la aplicación para crear el blob y la envía al usuario (como semilla o incrustada en un token físico). Una vez creado el blob, la autenticación en cualquier escenario sigue siempre el mismo formato. En los escenarios siguientes, no importa si el token es HOTP o TOTP.
Escenario I: Token: la semilla es generada por el fabricante del token y enviada en formato PSKC
a. Generación
- La aplicación selecciona o genera una llave maestra;
- La aplicación recibe el archivo PSKC y la clave de transporte;
- La aplicación pide al HSM que traduzca el archivo PSKC a blob;
- HSM devuelve blob;
- La aplicación recibe el blob, crea una relación entre el blob y el usuario y lo almacena en la base de datos;
- La aplicación envía el token físico al usuario;
b. Autenticación
- Véase más abajo;
Escenario II: Token: la semilla es generada por el fabricante del token y enviada en texto claro
a. Generación
- La aplicación selecciona o genera una llave maestra;
- La aplicación recibe una semilla en texto claro;
- La aplicación prepara una estructura blob OATH;
- La aplicación pide al HSM que cifre el blob OATH con la clave maestra;
- HSM devuelve los datos encriptados, que son los blob;
- La aplicación recibe el blob, crea una relación entre el blob y el usuario y lo almacena en la base de datos;
- La aplicación envía el token físico al usuario;
b. Autenticación
- Véase más abajo;
Escenario III: Soft Token: la semilla es generada por el usuario y recibida en texto claro
a. Generación
- La aplicación selecciona o genera una llave maestra;
- El usuario genera y exporta semillas en su aplicación OATH (teléfono inteligente, ordenador de sobremesa, etc.);
- El usuario envía la semilla a la aplicación;
- La aplicación recibe una semilla en texto claro;
- La aplicación prepara una estructura de datos OATH;
- La aplicación solicita al HSM que cifre la estructura de datos OATH con la clave maestra;
- HSM devuelve una estructura cifrada, que es el blob;
- La aplicación recibe el blob, crea una relación entre el blob y el usuario y lo almacena en la base de datos;
b. Autenticación
- Véase más abajo;
Escenario IV: Soft Token: HSM genera la semilla
a. Generación
- La aplicación selecciona o genera una llave maestra;
- La aplicación solicita la emisión de blob OATH;
- HSM genera la semilla, prepara el blob y lo devuelve a la aplicación;
- La aplicación recibe el blob, crea una relación entre el blob y el usuario y lo almacena en la base de datos;
- La aplicación envía el blob al HSM y solicita la semilla en texto claro;
- La aplicación envía la semilla al usuario, normalmente utilizando un canal seguro;
- El usuario importa las semillas a su aplicación OATH (teléfono inteligente, ordenador de sobremesa, etc.);
b. Autenticación
- Véase más abajo;
Autenticación de usuarios en cualquier escenario:
- El usuario envía la OTP generada a la aplicación;
- La aplicación recupera el blob del usuario de la base de datos y solicita la verificación al HSM pasándole el blob y la OTP;
- HSM procesa la solicitud y devuelve el resultado y el blob procesado;
- La aplicación recibe el blob y actualiza la base de datos;
- La aplicación informa al usuario del resultado de la autenticación;
Glosario
- otp: (one time password), contraseña de un solo uso
- token: dispositivo físico que genera otp a partir de una semilla, normalmente identificado por un número de serie único y del tamaño de un llavero. Es a prueba de manipulaciones.
- soft token: software generador de otp, normalmente instalado en un dispositivo móvil. Es menos seguro que el token físico.
- semilla: secuencia aleatoria de bytes utilizada como material criptográfico diversificador para generar otp. Debe mantenerse en secreto desde su generación hasta su utilización, incluido el transporte. Cada token o soft token debe estar asociado a una única semilla.
- paso de tiempo: intervalo utilizado para incrementar el cálculo TOTP para cada OTP. El tiempo en segundos entre cada generación de OTP.
- factor móvil: intervalo utilizado como incremento en el cálculo de HOTP para cada OTP. Contado por eventos.
- T0: Valor de tiempo UNIX (segundos desde la hora EPOCH) para empezar a contar los pasos de tiempo.
- truncation offset: método de truncamiento del cálculo HMAC para extraer el OTP.
- HOTP: (HMAC-based One-time Password Algorithm) estándar para generar otp por evento, normalmente provocado por el usuario, como pulsar un botón en el token, es decir, cada vez que el usuario pulsa el botón en el token, se genera una nueva otp.
- TOTP: (Time-based One-time Password Algorithm) norma para generar otp por tiempo; se genera una nueva otp en cada intervalo definido por el token, independientemente de la acción del usuario.
- blob: (binary large object), estructura cifrada que contiene información para la autenticación otp. El blob es completamente opaco fuera del HSM. La clave que cifra el blob es AES (128, 192 o 256 bits). La información contenida en el blob incluye la semilla, el tipo (HOTP o TOTP), el intervalo de generación y la hora de inicio (en el caso de TOTP) y mecanismos de protección contra ataques de repetición.
- resincronización: proceso de ajuste de los contadores internos de una blob a los valores generados por el token físico o soft token para que la autenticación siga funcionando correctamente. Este proceso suele realizarse aumentando temporalmente la ventana de tolerancia y buscando valores otp por el HSM, informando el usuario de dos o más otps generados en secuencia por el token.
- clave maestra: clave AES en el HSM que cifra el blob.
- clave de transporte: clave que cifra las semillas correspondientes a los tokens según la norma PSKC, para el transporte entre el fabricante del token y el integrador del sistema. Suele derivarse de una contraseña.
- pskc: (Portable Symmetric Key Container), un estándar para el transporte y la entrega seguros de semillas, basado en criptografía simétrica con derivación de clave por contraseña y formato XML.
- traducción pskc: proceso de importación de las semillas en formato PSKC, descifrado de las mismas y generación de blobs individuales para su almacenamiento en la base de datos. El proceso de traducción del descifrado del formato PSKC y del cifrado al blob se realiza dentro del HSM. Normalmente, un archivo PSKC contiene varias semillas cifradas con la misma clave de transporte; cada semilla corresponderá a una nota.
- base de datos: estructura para almacenar los blobs generados por el HSM. Puede ser, por ejemplo, un sistema de archivos o un DBMS (Database Management System). No hay necesidad de protección adicional para el blob almacenado, ya que solo se puede acceder a su contenido con la clave maestra AES del HSM.
Referencias
|
bool | OATHCheck (cadena masterKeyId, cadena otp, ref byte[] bBlob) |
| Compruebe el valor OTP.
|
|
bool | OATHCheck (cadena masterKeyId, cadena otp, ref byte[] bBlob, int dwFlag) |
| Compruebe el valor OTP.
|
|
bool | OATHCheck (cadena masterKeyId, cadena otp, byte[] bBlob) |
|
bool | OATHCheck (cadena masterKeyId, cadena otp, byte[] bBlob, int dwFlag) |
|
byte[] | OATHBlobResync (cadena szMasterKeyId, cadena szOTP1, cadena szOTP2, byte[] bOATHBlob) |
| Vuelve a sincronizar una nota OATH mostrando dos valores OTP continuos.
|
|
byte[] | OATHGetKey (cadena szMasterKey, byte[] pbInBlob) |
| Recupera la semilla de la clave que genera la mancha de OATH.
|
|
DinamoApi.OATH_PSKC_TRANSLATE_OUTPUT[] | OATHPskcTranslate (cadena szMasterKeyId, cadena szPSK, byte[] pbPSKC) |
| Importa semillas envueltas en el estándar PSKC (Portable Symmetric Key Container), RFC 6030.
|
|
byte[] | OATHIssueGenerateHOTP (cadena szMasterKeyId) |
| Genera un blob HOATH, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
|
|
byte[] | OATHIssueGenerateHOTP (cadena szMasterKeyId, byte seedLen) |
| Genera un blob HOATH, es decir, un token de evento a partir de un tamaño de semilla.
|
|
byte[] | OATHIssueImportHOTP (cadena szMasterKeyId, byte[] bSeed) |
| Importa un blob HOATH, es decir, un token de evento a partir de una semilla suministrada.
|
|
byte[] | OATHIssueGenerateTOTP (cadena szMasterKeyId) |
| Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
|
|
byte[] | OATHIssueGenerateTOTP (cadena szMasterKeyId, short paso) |
| Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
|
|
byte[] | OATHIssueGenerateTOTP (string szMasterKeyId, short step, ulong offset) |
| Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
|
|
byte[] | OATHIssueGenerateTOTP (string szMasterKeyId, short step, ulong offset, byte seedLen) |
| Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
|
|
byte[] | OATHIssueImportTOTP (cadena szMasterKeyId, byte[] bSeed) |
| Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
|
|
byte[] | OATHIssueImportTOTP (cadena szMasterKeyId, byte[] bSeed, paso corto) |
| Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
|
|
byte[] | OATHIssueImportTOTP (string szMasterKeyId, byte[] bSeed, short step, ulong offset) |
| Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
|
|
cadena | EncodeBase32 (byte[] datos) |
| Función de utilidad para codificar Base32. Codificación estándar para generadores OATH en software.
|
|
cadena | OATHGetNext (cadena szMasterKeyId, byte lenOTP, byte[] bBlob) |
| Recupera el siguiente valor para el OTP.
|
|
◆ OATHCheck() [1/4]
bool OATHCheck |
( |
cadena | masterKeyId, |
|
|
cadena | otp, |
|
|
ref byte[] | bBlob ) |
|
en línea |
Compruebe el valor OTP.
- Parámetros
-
- Excepciones
-
- Devolución
- >Verdadero si el OTP pasado en el parámetro de la función es válido. En este caso, la persistencia del bBlob devuelto es importante para evitar ataques REPLAY.
- Ejemplos
- oath.cs.
◆ OATHCheck() [2/4]
bool OATHCheck |
( |
cadena | masterKeyId, |
|
|
cadena | otp, |
|
|
ref byte[] | bBlob, |
|
|
int | dwFlag ) |
|
en línea |
Compruebe el valor OTP.
- Parámetros
-
masterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN. |
otp | OTP a comprobar para tamaño mínimo DinamoApi .ISSUE_OATH_MIN_OTP_LEN y máximo DinamoApi.ISSUE_OATH_MAX_OTP_LEN. |
bBlob | Matriz de bytes que contiene el blob que se utilizará para generar el OTP. Este búfer se reescribirá con el blob actualizado. |
dwFlag | A partir de la versión de firmware 4.0.2, el tamaño de la ventana de espera de autenticación se puede establecer en este parámetro. El valor por defecto es de 10 intervalos más o menos. En el caso de tokens HOTP, los intervalos se contarán por número de eventos; en el caso de tokens TOTP, se contarán por número de pasos de tiempo.
|
- Devolución
- True si el OTP pasado en el parámetro de la función es válido. En este caso, es importante persistir el bBlob devuelto para evitar ataques REPLAY.
- Excepciones
-
◆ OATHCheck() [3/4]
bool OATHCheck |
( |
cadena | masterKeyId, |
|
|
cadena | otp, |
|
|
byte[] | bBlob ) |
|
en línea |
- Obsoleto
- Utilice OATHCheck con bBlob como referencia.
◆ OATHCheck() [4/4]
bool OATHCheck |
( |
cadena | masterKeyId, |
|
|
cadena | otp, |
|
|
byte[] | bBlob, |
|
|
int | dwFlag ) |
|
en línea |
- Obsoleto
- Utilice OATHCheck con bBlob como referencia.
◆ OATHBlobResync()
byte[] OATHBlobResync |
( |
cadena | szMasterKeyId, |
|
|
cadena | szOTP1, |
|
|
cadena | szOTP2, |
|
|
byte[] | bOATHBlob ) |
|
en línea |
Vuelve a sincronizar una nota OATH mostrando dos valores OTP continuos.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN. |
szOTP1 | Primer valor de OATH. |
szOTP2 | Segundo valor de OATH |
bOATHBlob | Mancha de OATH |
- Devolución
- Blob de OATH resincronizado, resultado de la operación.
- Excepciones
-
◆ OATHGetKey()
byte[] OATHGetKey |
( |
cadena | szMasterKey, |
|
|
byte[] | pbInBlob ) |
|
en línea |
Recupera la semilla de la clave que genera la mancha de OATH.
- Parámetros
-
szMasterKey | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN. |
pbInBlob | Contenido del blob |
- Devolución
- Semilla de la clave en forma de matriz de bytes.
- Excepciones
-
- Ejemplos
- oath.cs.
◆ OATHPskcTraducir()
DinamoApi.OATH_PSKC_TRANSLATE_OUTPUT[] OATHPskcTranslate |
( |
cadena | szMasterKeyId, |
|
|
cadena | szPSK, |
|
|
byte[] | pbPSKC ) |
|
en línea |
Importa semillas envueltas en el estándar PSKC (Portable Symmetric Key Container), RFC 6030.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN. |
szPSK | Clave de transporte que protege las semillas notificadas en pbPSKC. |
pbPSKC | Contenido del archivo que contiene las semillas que se transformarán en blobs en formato HSM |
- Devolución
- OATHMatriz de estructuras DinamoApi. _PSKC_TRANSLATE_OUTPUT. Esta estructura contendrá internamente los blobs de las semillas traducidas al formato HSM y el identificador de cada semilla.
- Excepciones
-
◆ OATHIssueGenerateHOTP() [1/2]
byte[] OATHIssueGenerateHOTP |
( |
cadena | szMasterKeyId | ) |
|
|
en línea |
Genera un blob HOATH, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
- Parámetros
-
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
Esta función se utiliza cuando es posible asignar una semilla a un soft token. Se generará una semilla con el tamaño de un SHA1
◆ OATHIssueGenerateHOTP() [2/2]
byte[] OATHIssueGenerateHOTP |
( |
cadena | szMasterKeyId, |
|
|
byte | seedLen ) |
|
en línea |
Genera un blob HOATH, es decir, un token de evento a partir de un tamaño de semilla.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
seedLen | Semilla en formato binario. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
Esta función se utiliza cuando la semilla la proporciona un dispositivo software soft token (por ejemplo, una aplicación de teléfono móvil) o un dispositivo hadware hard_token (por ejemplo, un llavero generador de secuencias).
◆ OATHIssueImportHOTP()
byte[] OATHIssueImportHOTP |
( |
cadena | szMasterKeyId, |
|
|
byte[] | bSemilla ) |
|
en línea |
Importa un blob HOATH, es decir, un token de evento a partir de una semilla suministrada.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
bSeed | Semilla en formato binario. |
- Excepciones
-
- Devolución
- Blob de OATH, el resultado de la operación.
◆ OATHIssueGenerateTOTP() [1/4]
byte[] OATHIssueGenerateTOTP |
( |
cadena | szMasterKeyId | ) |
|
|
en línea |
Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
- Parámetros
-
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
Esta función se utiliza cuando es posible asignar una semilla a un testigo blando
- Ejemplos
- oath.cs.
◆ OATHIssueGenerateTOTP() [2/4]
byte[] OATHIssueGenerateTOTP |
( |
cadena | szMasterKeyId, |
|
|
corto | paso ) |
|
en línea |
Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
paso | Intervalo de tiempo utilizado en el cálculo, también conocido como ventana de tiempo para el cambio de valor. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ OATHIssueGenerateTOTP() [3/4]
byte[] OATHIssueGenerateTOTP |
( |
cadena | szMasterKeyId, |
|
|
corto | paso, |
|
|
ulong | offset ) |
|
en línea |
Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
paso | Intervalo de tiempo utilizado en el cálculo, también conocido como ventana de tiempo para el cambio de valor. |
offset | Retraso del reloj a tener en cuenta. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ OATHIssueGenerateTOTP() [4/4]
byte[] OATHIssueGenerateTOTP |
( |
cadena | szMasterKeyId, |
|
|
corto | paso, |
|
|
ulong | offset, |
|
|
byte | seedLen ) |
|
en línea |
Genera un blob TOTP, es decir, un token de evento. La semilla será generada aleatoriamente por el HSM.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
paso | Intervalo de tiempo utilizado en el cálculo, también conocido como ventana de tiempo para el cambio de valor. |
offset | Retraso del reloj a tener en cuenta. |
seedLen | Tamaño de la semilla. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ OATHIssueImportTOTP() [1/3]
byte[] OATHIssueImportTOTP |
( |
cadena | szMasterKeyId, |
|
|
byte[] | bSemilla ) |
|
en línea |
Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
bSeed | Semilla en formato binario. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ OATHIssueImportTOTP() [2/3]
byte[] OATHIssueImportTOTP |
( |
cadena | szMasterKeyId, |
|
|
byte[] | bSeed, |
|
|
corto | paso ) |
|
en línea |
Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
bSeed | Semilla en formato binario. |
paso | Intervalo de tiempo utilizado en el cálculo, también conocido como ventana de tiempo para el cambio de valor. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ OATHIssueImportTOTP() [3/3]
byte[] OATHIssueImportTOTP |
( |
cadena | szMasterKeyId, |
|
|
byte[] | bSeed, |
|
|
corto | paso, |
|
|
ulong | offset ) |
|
en línea |
Importa un blob TOTP, es decir, un token de evento a partir de una semilla suministrada.
- Parámetros
-
szMasterKeyId | Nombre de la clave maestra, utilizada para proteger los blobs, de tamaño máximo DinamoApi.MAX_OBJ_ID_FQN_LEN |
bSeed | Semilla en formato binario. |
paso | Intervalo de tiempo utilizado en el cálculo, también conocido como ventana de tiempo para el cambio de valor. |
offset | Retraso del reloj a tener en cuenta. |
- Devolución
- Blob de OATH, el resultado de la operación.
- Excepciones
-
◆ CodificarBase32()
cadena EncodeBase32 |
( |
byte[] | fecha | ) |
|
|
en línea |
◆ OATHGetNext()
cadena OATHGetNext |
( |
cadena | szMasterKeyId, |
|
|
byte | lenOTP, |
|
|
byte[] | bBlob ) |
|
en línea |
Recupera el siguiente valor para el OTP.
- Parámetros
-
- Devolución
- Valor de la siguiente ficha
- Excepciones
-