API Java
HSM Dinamo
|
Operaciones de transferencia electrónica de fondos.
Las API del módulo EFT(Electronic Funds Transfer) están destinadas a las operaciones de autenticación de usuarios y verificación de identidad en las transacciones de Visa y Mastercard.
Por lo general, la identidad del usuario de la tarjeta puede verificarse de dos maneras:
Las normas adoptadas se ajustan al Manual de Normas de Tecnología de Pagos de Visa (octubre de 2007).
En términos generales, el proceso de transferencia de fondos con tarjeta sigue el flujo de la figura siguiente. En el proceso intervienen varios actores. El titular de la tarjeta la presenta al minorista (minorista/comerciante), la autenticidad del titular de la tarjeta puede verificarse mediante un PIN, que el titular introduce en la estación del minorista (por ejemplo, un terminal de punto de venta). A partir de ahí, el PIN se encripta (se genera un Bloque PIN) y los datos de la transacción se envían a un proveedor de servicios de pago electrónico contratado por el comerciante (Adquirente), que a su vez envía los datos a la correspondiente red de tarjetas, según la marca de tarjeta utilizada por el titular, y de ahí se envían al emisor de la tarjeta, que dispone de los datos de identificación, crédito y otros sobre el titular y mantiene un contrato con el titular para el uso del servicio. Tras analizar los datos de la transacción, en términos de registro, crédito y autenticación, entre otros, el emisor puede autorizar o rechazar la transacción, y este mensaje de respuesta viaja en sentido contrario.
Desde el punto de vista de las claves de cifrado utilizadas en el proceso, éste se muestra en la figura siguiente. Cada actor conserva sus propias claves, y cada vez que un mensaje cifrado debe pasar de un actor a otro, hay que traducir el cifrado, es decir, utilizar la clave correspondiente del actor que debe descifrar el mensaje.
Pueden utilizarse variaciones o simplificaciones del esquema anterior, por ejemplo, cuando una misma entidad desempeña más de una función, o existe una comunicación directa del adquirente con el emisor, como puede ocurrir en determinadas operaciones de débito.
Acerca de la compatibilidad con los algoritmos del protocolo 3-D Secure:
HSM Dinamo implementa algoritmos criptográficos que soportan el protocolo 3-D Secure, desarrollado por Visa. Los servicios Verified by Visa de Visa y Secure Code de Mastercard son ofrecidos por marcas basadas en este protocolo. HSM implementa los algoritmos criptográficos de verificación de tarjetas que soportan el protocolo y los servicios, permitiendo al usuario de HSM generar y verificar códigos, CVC2 (Card Verification Code 2) y HMAC SHA1 en el caso de Mastercard (Secure Payment Application Algorithm) y CAVV (Cardholder Authentication). Valor de Verificación, CVV2 con método ATN) en el caso de Visa.
El HSM es compatible con los mecanismos de autenticación CAP (Visa) y DPA (Mastercard).
El HSM ofrece soporte para la carga/transporte remoto de claves ATM mediante funcionalidades criptográficas basadas en funciones RSA y X.509.
La aplicación del HSM cumple las normas definidas en la documentación que se indica a continuación:
EMVCo
Visa
Mastercard
Enlace
JCB
Otros
Existen tres formas de generar y verificar el CVV(valor de verificación de la tarjeta) en el HSM:
La clave utilizada para la generación del CVV y los cálculos de verificación se denomina CVK(Card Verification Key). Esta clave es interna al HSM, la aplicación sólo tiene que introducir su nombre de clave (id). Físicamente, es una clave 3DES de 112 bits, que corresponde a dos claves DES de 56 bits.
La figura siguiente ilustra los diagramas de generación y comprobación de CVV, iCVV y CVV2.
El HSM funciona generando PINs (Números de Identificación Personal) mediante un mecanismo de derivación, basado en una clave interna llamada PGK(Clave de Generación de PIN). Esta forma de generación presenta varias ventajas, especialmente en comparación con el método de generación de PINs con valores aleatorios, ya que no requiere el uso de una base de datos para su validación (con la probable exposición de datos sensibles) y además mantiene tanto el proceso de generación como el de validación más seguros, al realizarse internamente al HSM.
El estándar utilizado para generar el PIN por el HSM es el IBM 3624, que utiliza compensaciones para que el PIN pueda ser modificado por el usuario o el emisor de la tarjeta. Para mitigar los ataques de decimalización y verificación, el HSM utiliza una tabla de conversión interna que no se expone a la aplicación. Como factor de seguridad adicional, se utiliza una clave 3DES de 168 bits en lugar de una clave 3DES de 112 bits; no hay interferencias en el funcionamiento del algoritmo, ya que las claves DES y 3DES utilizan bloques de entrada y salida del mismo tamaño.
Se definen tres modos de generación de PIN por derivación:
No hay gestión de reglas de negocio para PINs generados dentro del HSM; esta función debe ser llevada a cabo por la aplicación llamante.
Los algoritmos de generación mediante el estándar IBM 3624 se muestran en los siguientes diagramas.
Para que el usuario(titular de la tarjeta) pueda seleccionar su propio PIN, en el método IBM 3624 se utiliza un desplazamiento del PIN, de modo que se requieren dos nuevas entradas, el PIN establecido por el usuario y una comprobación de 4 bits de longitud. La operación de desplazamiento se realiza después de los pasos del algoritmo IBM 3624 mostrados anteriormente. Esto permite que el proceso interno del HSM valide el PIN, aunque el usuario defina un PIN diferente al generado inicialmente por el HSM.
Las operaciones PIN BlockTranslate funcionan con dos claves, una de origen y otra de destino; existe una fase intermedia para compatibilizar, si es posible, el formato de entrada con el de salida. Hay determinados formatos de bloque que no son interoperables, ya sea porque no hay datos para la conversión o por una restricción de la norma.
El modo de traducción por defecto del HSM consiste en traducir el bloque de entrada al formato ISO PIN Block Format 0. En el modo de traducción automática, la conversión se realiza de forma opaca, convirtiendo del bloque con la clave de origen al bloque con la clave de destino, sin analizar el formato ni el contenido del bloque.
Cuando se verifica un Bloque PIN, tienen lugar dos operaciones clave: primero se descifra el Bloque PIN con la PTK(Clave de Transporte PIN), se extrae el PIN del Bloque PIN descifrado, y luego se verifica el PIN utilizando la PGK(Clave de Generación PIN, la misma clave utilizada para generar el PIN original). Esta verificación puede realizarse con o sin el uso de un desplazamiento; este desplazamiento del PIN no forma parte del Bloque PIN y no está cifrado por la PTK. El formato de bloque PIN esperado es el formato ISO PIN Block Format 0 (equivalente a ANSI PIN Block Format 0 y VISA PIN Block Format 1).
DUKPT(Derived Unique Key Per Transaction) es una forma de utilizar claves únicas por transacción, derivadas de una clave fija, y este proceso se define en ANSI X9.24 parte 1.
El KSN(Key Serial Number) es el identificador de una clave de transacción y se divide en partes como: KSI(Key Set ID), TRSM(Tamper Resistant Security Module), POS(Point of Sale) identificador también conocido como DID(Device ID) y el CTR(Transaction Counter).
HSM utiliza las partes de KSN separadas en KSI y DID + CTR, cada una de las cuales contiene 5 bytes.
Los pasos del proceso de utilización de DUKPT son, en cada extremo de la comunicación:
En el punto de venta:
En HSM:
Se trata de un proceso de envoltura/_desenvoltura_ con protección de la confidencialidad y la integridad de las claves y los datos asociados, definido en el documento ASC X9 TR 31-2018.
KBPK(Key Block Protection Key) es la clave de derivación utilizada para derivar las claves de cifrado y autenticación. Esta clave sólo se utiliza para la derivación. También se conoce como KWK (Key Wrapping Key). Se almacena en el HSM.
KBEK(Key Block Encryption Key) es la clave derivada de KBPK y utilizada únicamente para el cifrado de bloque de claves. Se genera con cada operación de envoltura/desenvoltura y no se almacena de forma persistente en el HSM.
KBAK(Key Block Authentication Key) es la clave derivada de KBPK y utilizada únicamente para calcular la MAC de la clave klock. Se genera con cada operación de envoltura/desenvoltura y no se almacena de forma persistente en el HSM.
KDID(Key Derivation Input Data) son los datos utilizados para derivar las claves KBEK y KBAK. Contiene datos como: contador, indicador de uso de clave, indicador de algoritmo y tamaño. Varía en función del método de derivación utilizado, la clave que debe derivarse y otros parámetros.
La derivación de las claves KBEK y KBAK utiliza CMAC con los datos de entrada de derivación de claves (específicos de cada clave derivada) y la clave KBPK como entrada.
El bloque Clave contiene los datos de la clave exportada. Este bloque se divide en 3 partes:
Funciones | |
Cadena | generateDUKPT (byte[] baKSI, byte[] baDID_CTR, int dwParam) throws TacException |
Genera una clave DUKPT dentro del HSM utilizando un KSI (Key Serial Identification), un DID (Device ID) y un CTR (Transaction Counter) del mismo KSN (Key Serial Number). | |
Cadena | generateDUKPTName (byte[] baKSI, byte[] baDID_CTR) throws TacException |
Genera el nombre del DUKPT a partir del KSI y el CTR introducidos. | |
Cadena | generateBDKName (byte[] baKSI) throws TacException |
Genera el nombre del BDK a partir de un KSI (Key Serial Identification). | |
byte[] | translatePINBlock (String srcPEK, String dstPEK, int transBlockType, String PAN, byte[] inPINBlock) throws TacException |
Traduce un bloque PIN, descifrándolo con una clave y cifrándolo con otra. | |
byte[] | exportTR31 (String kbpk, String key, int usage, byte mode, byte export) throws TacException |
Exporta una clave en formato TR-31 según la norma ASC X9 TR 31-2018. | |
void | importTR31 (String kbpk, String key, int keyAttributes, byte[] keyBlock) throws TacException |
Importe una clave en formato TR-31 según la norma ASC X9 TR 31-2018. | |
Cadena generateDUKPT | ( | byte[] | baKSI, |
byte[] | baDID_CTR, | ||
int | dwParam ) lanza una TacException |
Genera una clave DUKPT dentro del HSM utilizando un KSI (Key Serial Identification), un DID (Device ID) y un CTR (Transaction Counter) del mismo KSN (Key Serial Number).
baKSI | Buffer de tamaño TacNDJavaLib.MIN_KSI_LEN que contiene el KSI (primeros 05 bytes del KSN). | ||||||||||||||
baDID_CTR | Buffer de tamaño TacNDJavaLib.MIN_CTR_LEN que contiene el DID y el CTR (últimos 05 bytes del KSN). | ||||||||||||||
dwParam | Banderas de funcionamiento según la tabla siguiente.
|
TacException |
Cadena generateDUKPTName | ( | byte[] | baKSI, |
byte[] | baDID_CTR ) lanza una TacException |
Genera el nombre del DUKPT a partir del KSI y el CTR introducidos.
baKSI | Buffer de tamaño TacNDJavaLib.MIN_KSI_LEN que contiene el KSI (primeros 05 bytes del KSN). |
baDID_CTR | Buffer de tamaño TacNDJavaLib.MIN_CTR_LEN que contiene el DID y el CTR (últimos 05 bytes del KSN). |
TacException |
Cadena generateBDKName | ( | byte[] | baKSI | ) | lanza una TacException |
Genera el nombre del BDK a partir de un KSI (Key Serial Identification).
baKSI | Buffer de tamaño TacNDJavaLib.MIN_KSI_LEN que contiene el KSI (primeros 05 bytes del KSN). |
TacException |
byte[] translatePINBlock | ( | Cadena | srcPEK, |
Cadena | dstPEK, | ||
int | transBlockType, | ||
Cadena | PAN, | ||
byte[] | inPINBlock ) lanza una TacException |
Traduce un bloque PIN, descifrándolo con una clave y cifrándolo con otra.
El formato de bloque entrante se identifica automáticamente, y el formato de bloque saliente puede ser definido por el emisor de la llamada, siempre que el cambio de formato no sea de un PAN Unbound a un PAN Bound. Los formatos PAN Bound son aquellos que utilizan información PAN en su composición. Por tanto, es posible realizar tanto la traducción de claves como la traducción de formatos. El llamante puede realizar una validación forzada del formato indicando para el formato saliente, el mismo que está utilizando en el Bloque PIN entrante.
srcPEK | Identificador de la clave de descifrado dentro del HSM. | ||||||||||||
dstPEK | Identificador de la clave de cifrado dentro del HSM. | ||||||||||||
transBlockType | Identificador del formato del bloque de salida. Según la tabla siguiente.
| ||||||||||||
PAN | PAN (Número de cuenta principal). | ||||||||||||
inPINBlock | Entrada de bloque PIN. El búfer debe tener el tamaño de un PIN Block, TacNDJavaLib.DES_BLOCK (8 bytes). |
TacException |
byte[] exportTR31 | ( | Cadena | kbpk, |
Cadena | clave, | ||
int | uso, | ||
byte | modo, | ||
byte | exportar ) lanza una TacException |
Exporta una clave en formato TR-31 según la norma ASC X9 TR 31-2018.
kbpk | Nombre de la clave KBPK (Key Block Protection Key) utilizada para derivar las claves de cifrado y autenticación. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clave | Nombre de la clave que se exportará del HSM. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uso | Identificador de uso de clave, como se describe en ASC X9 TR 31-2018 Sección A.5.1 tabla 6. Se aceptan las siguientes opciones.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
modo | Identificador del modo de uso de la clave, como se describe en ASC X9 TR 31-2018 Sección A.5.3 tabla 8. Se aceptan las siguientes opciones.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exportar | Identificador clave de exportabilidad, como se describe en ASC X9 TR 31-2018 Sección A.5.5 tabla 10. Se aceptan las siguientes opciones.
|
TacException |
Algoritmo KBPK | Método de exportación |
---|---|
3DES | 5.3.2.1 Método vinculante de derivación de claves - TDEA |
AES | 5.3.2.3 Método de vinculación de bloques de claves - AES |
void importTR31 | ( | Cadena | kbpk, |
Cadena | clave, | ||
int | keyAttributes, | ||
byte[] | keyBlock ) lanza una TacException |
Importe una clave en formato TR-31 según la norma ASC X9 TR 31-2018.
kbpk | Nombre de la clave KBPK (Key Block Protection Key) utilizada para derivar las claves de cifrado y autenticación. |
clave | Nombre de la clave que se importará en el HSM. |
keyAttributes | Parámetros adicionales de la clave. Consulte las opciones del método createKey(). |
keyBlock | bloque de teclas |
TacException |
Algoritmo KBPK | Método |
---|---|
3DES | 5.3.2.1 Método vinculante de derivación de claves - TDEA |
AES | 5.3.2.3 Método de vinculación de bloques de claves - AES |