# Seguridad y enlace de dispositivos

La seguridad en el Get Mini Android SDK se logra delegando todas las operaciones de pago sensibles a un **PIN pad externo certificado** y aplicando una asociación de terminal controlada a través de flujos de autenticación y activación gestionados por el backend. La aplicación Android actúa únicamente como un controlador host y nunca maneja datos sin procesar de tarjetas o claves criptográficas.

Este documento describe los **mecanismos reales de seguridad y asociación implementados por el Get Mini Android SDK**, basados en el sistema de Login y Login Transparente (activación de dispositivo).

---

## Modelo de asociación de terminal

El modelo de seguridad del Get Mini Android SDK garantiza que cada configuración de terminal (identificadores de comercio y terminal) solo pueda ser operada por **dispositivos y usuarios autorizados**. Esto previene el uso no autorizado de credenciales de comercio y aplica responsabilidad para todas las transacciones procesadas a través del SDK.

La asociación de terminal en el Get Mini Android SDK es **administrativa y lógica**, no basada en hardware. Es gestionada por el backend y aplicada a través de procedimientos controlados de Login y activación.

---

## Identificadores de terminal

Cada terminal de Get Mini se identifica por dos parámetros obligatorios:

* **FUC (Identificador único del Comercio)**: Identifica únicamente al comercio dentro del sistema de autorización (por ejemplo, un código de comercio único).
* **Número de Terminal**: Identifica un terminal lógico específico bajo la cuenta del comercio (valores del 1 al 99).

Los metadatos adicionales del terminal incluyen:

* **NSerie**: Número de serie del terminal.
* **Type**: Tipo de terminal (Virtual = 1, PC = 2).
* **Csb**: Entidad del terminal.
* **Currency**: Código numérico de moneda (por ejemplo, 978).
* **CurrencyCode**: Código alfanumérico de moneda (por ejemplo, «EUR»).

Estos identificadores se asignan durante la incorporación del comercio y se devuelven a la aplicación como parte de la respuesta de Login en objetos `RedCLSTerminalData`. Todas las operaciones de pago requieren una combinación válida de FUC y Número de Terminal.

---

## Autorización de dispositivo y vinculación de Login

Antes de que un terminal pueda usarse en un dispositivo Android, debe estar explícitamente autorizado a través de los mecanismos de Login del Get Mini Android SDK.

El SDK admite los siguientes flujos de autorización:

### Login

El método de Login estándar autentica a los usuarios con nombre de usuario y contraseña:

```
RedCLSLoginSsmResponse response =
    RedCLSMerchantConfigurationManager.login(loginData);
```

Esto devuelve:
* Una lista de comercios (`RedCLSMerchantData`) a los que el usuario tiene acceso.
* Para cada comercio, una lista de terminales (`RedCLSTerminalData`) disponibles para operaciones.
* Metadatos del usuario (vencimiento de contraseña, tipo de usuario).

La aplicación no puede realizar operaciones de pago sin un Login exitoso y una selección de terminal válida.

### Login Transparente (activación de dispositivo)

El Login Transparente permite que un dispositivo opere terminales sin requerir nombre de usuario/contraseña en cada inicio. Este es un **proceso de tres pasos**:

#### 1. Solicitud de activación inicial

Después de un Login exitoso basado en credenciales, la aplicación puede solicitar la activación del dispositivo para terminales específicos:

```
RedCLSLoginTransLoginResponse response =
    RedCLSMerchantConfigurationManager.autoLogin(context, autoLoginData);
```

El objeto `RedCLSLoginTransAutoLoginData` contiene:
* La lista de terminales a activar (`List<RedCLSTerminalData>`).
* Los datos y respuesta de Login originales.
* Una bandera de notificación por correo electrónico opcional (típicamente `false`).

Esto crea una **solicitud de activación de dispositivo** que debe ser aprobada por el administrador del comercio.

#### 2. Aprobación del administrador

El administrador del comercio recibe la solicitud de activación y debe aprobarla explícitamente a través del portal backend. Hasta la aprobación, el dispositivo no puede usar el Login Transparente.

#### 3. Inicios de sesión posteriores sin credenciales

Una vez aprobado, el dispositivo puede recuperar datos del terminal en inicios posteriores sin credenciales:

```
RedCLSLoginTransLoginResponse response =
    RedCLSMerchantConfigurationManager.loginWithoutUser(context);
```

Esto devuelve la misma estructura de datos del terminal que el Login basado en credenciales, permitiendo que la aplicación proceda con operaciones de pago.

### Añadir terminales adicionales

Después de la activación inicial, se pueden añadir terminales adicionales a un dispositivo ya activado. Para ello, crea un objeto `RedCLSLoginTransPetNuevoTerminal` indicando Fuc (identificador del comercio), Terminal (número de terminal) y Type (tipo de terminal) del nuevo terminal a dar de alta.

```
ResponseData response =
    RedCLSMerchantConfigurationManager.addTerminal(context, terminalData);
```

Esto requiere aprobación del administrador antes de que el nuevo terminal aparezca en las respuestas posteriores de `loginWithoutUser()`.

### Desactivar el Login Transparente

Para eliminar la autorización del dispositivo:

```
RedCLSMerchantConfigurationManager.disableLoginTrans(context);
```

Esto desvincula el dispositivo de todos los terminales activados, requiriendo un nuevo proceso de activación para restaurar el acceso.

---

## Gestión de claves criptográficas

En la arquitectura del Get Mini Android SDK, **todas las operaciones criptográficas se ejecutan en el PIN pad externo**.

Las siguientes operaciones:

* Captura de datos de tarjeta (EMV, sin contacto, banda magnética).
* Entrada y verificación de PIN.
* Procesamiento de transacciones EMV.
* Cifrado y uso seguro de claves.

se realizan completamente dentro del hardware certificado del PIN pad.

### Almacenamiento y carga de claves

Las claves criptográficas se almacenan en "cajones" seguros dentro del PIN pad. Durante la inicialización (`inicializarPinpad()`), el SDK informa:

* **estadoUltimaCargaClaves**: Estado de la última operación de carga de claves.
  * 0 = No se cargaron claves en el PIN pad.
  * 1 = Claves cargadas correctamente.

* **Cajones**: Lista de cajones de claves disponibles, cada uno conteniendo:
  * Información de versión de clave (CI, CA, CTC, CPIN).
  * Valores de control para cada tipo de clave.
  * Estado de carga de clave (0 = cargada correctamente, 1 = no cargada).

Si se requieren actualizaciones de claves, el SDK las maneja **de forma transparente durante la inicialización**. La aplicación nunca accede ni gestiona estas claves directamente.

### Qué maneja tu aplicación

Como resultado de esta arquitectura:

* La aplicación Android **nunca accede a datos sin procesar de tarjetas**.
* No existen claves de cifrado en el proceso de la aplicación o en el almacenamiento del dispositivo.
* La aplicación solo recibe números de tarjeta enmascarados e identificadores de transacción adecuados para recibos y mantenimiento de registros.

---

## Mejores prácticas de seguridad

Al implementar el SDK de Get Mini Android, sigue estas pautas:

* **Nunca almacenes ni registres datos de tarjetas**. Usa solo los valores enmascarados e identificadores devueltos en `RedCLSTransactionData` (por ejemplo, números de tarjeta enmascarados, códigos de autorización, referencias de transacción).
* **Aplica autenticación de usuario** dentro de tu aplicación antes de permitir operaciones de pago.
* **Separa los entornos estrictamente**. Usa terminales de integración o certificación (CCAL) para desarrollo y pruebas, y terminales de producción solo en entornos en vivo.
* **Maneja los códigos de error explícitamente**. Siempre evalúa el campo `status` y los códigos de error de `RedCLSErrorCodes` antes de asumir un resultado de transacción.
* **Mantén el SDK actualizado** para beneficiarse de correcciones de seguridad y actualizaciones de protocolo.
* **Protege las credenciales de Login**. Nunca codifiques nombres de usuario o contraseñas en el código de tu aplicación.
* **Usa el Login Transparente con cuidado**. Solo activa terminales de producción en dispositivos de producción, ya que la desactivación requiere acción administrativa.

---

## Consideraciones de entorno

El Get Mini Android SDK admite múltiples entornos de ejecución, configurados a través de:

```
RedCLSConfigurationLibrary.setiEntorno(environment);
```

Entornos disponibles:

* **ENTORNO_DESARROLLO**: Desarrollo (reservado para Redsys).
* **ENTORNO_INTEGRACION**: Pruebas de integración.
* **ENTORNO_CCAL**: Entorno de certificación.
* **ENTORNO_REAL**: Producción.

Cada entorno tiene su propio:

* Configuraciones y credenciales de terminal.
* Sistemas de autorización backend.
* Infraestructura de gestión de claves.

Las asociaciones de terminal son **específicas del entorno** y no se pueden reutilizar entre entornos.

<Callout type="warning">

Siempre usa credenciales que no sean de producción durante el desarrollo y las pruebas. Activar terminales de producción en dispositivos de desarrollo puede requerir intervención administrativa para deshacer.

</Callout>

Durante el desarrollo, siempre inicializa el SDK con entornos que no sean de producción para evitar la vinculación accidental o el procesamiento de transacciones en vivo.

---

## Recursos relacionados

* [**Ciclo de Vida de la Transacción**](/es/get-mini/android-sdk/core-concepts/transaction-lifecycle): Comprenda las etapas del flujo de transacción segura.
* [**Inicio Rápido: Tu Primera Venta**](/es/get-mini/android-sdk/first-steps/android-sdk-quickstart): Login, inicialización del PIN pad y ejecución del pago.
* [**Añadir el SDK a tu Proyecto**](/es/get-mini/android-sdk/first-steps/add-sdk-to-project): Configuración del entorno y permisos.