> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/es/security-and-privacy/security-guidance.md).

# Guía de seguridad

## Resumen

Use esta guía de seguridad al construir y lanzar un iOS **aplicación de billetera digital** que integra el SDK de Billetera NFC.

Esta guía es un conjunto de directrices de seguridad que debe aplicar antes del lanzamiento.

## Directrices generales de seguridad

### Use la última versión del SDK de Billetera NFC

Use la última versión del SDK de Billetera NFC. Incluye las últimas actualizaciones y correcciones de seguridad.

### Use la compilación Release del SDK de Billetera NFC

Antes de publicar en la App Store, configure su aplicación de billetera digital para usar la `Versión` compilación.

{% hint style="warning" %}
El `Depuración` variante del SDK no está permitida en el Entorno de Producción.
{% endhint %}

### Eliminar símbolos de depuración

No publique con símbolos de depuración. Esta práctica facilita los esfuerzos de ingeniería inversa y permite la identificación fácil de variables, estructuras y lógica sensibles.

### Evitar fugas de datos sensibles

Borre los datos sensibles de la interfaz de usuario antes de que la aplicación pase a segundo plano.

Encripte o borre los datos hasta que la aplicación vuelva al primer plano.

Evite registrar información sensible.

### Use ofuscación de código

Use ofuscación para aumentar el costo de la ingeniería inversa.

### Asegurar la comunicación de red

Use HTTPS para todas las llamadas de red al backend de la billetera digital.

Evite certificados autofirmados.

Si implementa fijación de certificado (certificate pinning), siga estas directrices:

* Corresponda el nombre de host con el certificado hoja (leaf).
* Valide la cadena completa de certificados contra el almacén de confianza del sistema.
* Rechace certificados vencidos.
* Fije (pin) el hash SHA-256 del CA raíz o del certificado hoja.

Si envía datos confidenciales que contienen información de identificación personal (PII), añada encriptación y autenticación a nivel de aplicación cuando sea necesario.

### Agregar protección RASP

Use una solución comercial de Protección de Aplicación en Tiempo de Ejecución ([RASP](https://en.wikipedia.org/wiki/Runtime_application_self-protection)).

Detectar y responder a:

* Root o jailbreak.
* Depuración.
* Hooking.
* Manipulación de la aplicación.
* Ejecución en emulador.

### Registro de logs

Evite escribir datos sensibles en los registros del dispositivo.

Use banderas de compilación para excluir logs de depuración de las compilaciones del Entorno de Producción.

### Adoptar prácticas seguras de codificación

Aplique prácticas seguras de codificación durante el desarrollo. Por ejemplo, debe:

* realizar validación de entradas.
* gestionar adecuadamente la memoria.
* usar funciones C seguras.
* evitar el uso de contenedores inmutables para almacenar datos sensibles.

Para una lista de verificación básica, consulte OWASP [Prácticas seguras de codificación](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide).

Estas prácticas pueden hacerse cumplir usando herramientas de análisis estático de código como PMD o HP Fortify.

### Realizar auditorías y pruebas de penetración

Realice auditorías de arquitectura y código, además de pruebas de penetración, para identificar vulnerabilidades y evaluar la postura general de seguridad de la aplicación.

### Evaluar la resiliencia de la seguridad de la aplicación <a href="#evaluate-the-resilience-of-application-security" id="evaluate-the-resilience-of-application-security"></a>

Consulte el OWASP MASVS (Mobile Application Security Verification Standard) en [OWASP MASVS](https://github.com/OWASP/owasp-masvs). Este es el conjunto base de requisitos de seguridad para aplicaciones móviles.

Se recomienda encarecidamente usar la OWASP MSTG [lista de verificación](https://github.com/OWASP/owasp-mastg/releases/latest) para evaluar la postura de seguridad de su aplicación.

## Directrices de seguridad para desarrolladores iOS

### Evitar la exposición de datos sensibles durante el ciclo de vida de la app

Elimine el contenido de UI sensible cuando la app pase a segundo plano.

Borre o encripte los datos sensibles hasta que la app vuelva al primer plano.

Evite registrar datos sensibles.

Use estos hooks de iOS:

* `applicationWillResignActive`: Borre la pantalla. Encripte los datos sensibles.
* `applicationDidBecomeActive`: Restaure la UI. Desencripte los datos sensibles.
* `UIScreenCapturedDidChangeNotification`: Detecte captura de pantalla. Borre el contenido sensible de la UI.

Ejemplo: ocultar el contenido de la app al resignar activo.

```swift
UIApplication.shared.keyWindow?.isHidden = true
```

### Eliminar símbolos de la salida de Xcode

Para Xcode, establezca estos valores en la configuración de compilación de release:

```
DEPLOYMENT_POSTPROCESSING = YES
GCC_GENERATE_DEBUGGING_SYMBOLS = NO
STRIP_INSTALLED_PRODUCT = YES
STRIP_STYLE = all
COPY_PHASE_STRIP = YES
```

### Gestionar datos sensibles en Swift

Minimice las copias de bytes sensibles.

[Data](https://developer.apple.com/documentation/foundation/data) es un tipo por valor en Swift. Asignarlo o pasarlo puede crear copias de los bytes subyacentes.

Pase los bytes asignados por referencia (usando `inout` argumento).

```swift
func helloWorld(_ data: inout Data) { 
    ... 
}

var data = Data()
helloWorld(&data)
```

Borrar `Data` después de usar:

```swift
extension Data {
    internal mutating func wipe() {
        guard count > 0 else {
            return
        }
        let length = count
        withUnsafeMutableBytes { ptr in
            if let mutableRawPtr = ptr.baseAddress {
                memset_s(mutableRawPtr, length, 0, length)
            }
        }
    }
}
```

### Desactivar caché de autocorrección para entradas sensibles

Desactive la autocorrección para campos que aceptan datos sensibles.

Use una de estas opciones:

* Establecer `secureTextEntry = true`.
* Establecer `autoCorrectionType = UITextAutocorrectionType.no`.

### Desactivar copiar y pegar para entradas sensibles

Desactive el menú de copiar/pegar para campos sensibles. Esto impide que un atacante con acceso al dispositivo pegue y vea los datos copiados.

```swift
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    let menuController = UIMenuController.shared
    menuController.isMenuVisible = false
    return false
}
```

### Prevenir la manipulación de la app

Verifique la integridad de la app en tiempo de ejecución para operaciones sensibles.

Puede calcular la suma de verificación (checksum) de la `__text` sección de la `__TEXT` segmento.

Para detalles de implementación, consulte la guía OWASP MSTG (Mobile Security Testing Guide) sobre [Defensas anti-reversing en iOS](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md).

Use ofuscación fuerte para proteger la implementación del checksum.

### Habilitar opciones de endurecimiento de Xcode

Use configuraciones de Xcode que dificulten la explotación y la ingeniería inversa.

<details>

<summary>Configuraciones recomendadas de Xcode</summary>

```
GCC_UNROLL_LOOPS = YES
GCC_OPTIMIZATION_LEVEL = 3
OTHER_CFLAGS = -fstack-protector-all -finline-functions
CLANG_ENABLE_OBJC_ARC = YES
GCC_DYNAMIC_NO_PIC = NO
LD_NO_PIE = NO
RUN_CLANG_STATIC_ANALYZER = YES
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES
```

</details>

## Gestionar la distribución en App Store

Los usuarios finales pueden descargar una versión “última compatible” anterior de su **aplicación de billetera digital**.

Cada versión publicada incrementa su superficie de ataque. Mantenga el conjunto de versiones compatibles pequeño.

### Limitar descargas de versiones antiguas

Desactive las descargas de versiones anteriores en App Store Connect cuando sea posible.

Para el comportamiento y las etiquetas de UI actuales de Apple, consulte [App Store Connect](https://developer.apple.com/support/app-store-connect/).

{% hint style="info" %}
Elimine versiones antiguas rápidamente después de publicar una corrección de seguridad.
{% endhint %}

Se recomienda mantener una única versión actualizada de su aplicación de billetera digital. Ajuste la configuración de compilación para soportar un amplio rango de versiones de iOS.

### Reducir entornos de ejecución inseguros

No distribuya compilaciones para simulador.

* **Desactivar el destino Simulator**: El objetivo de despliegue solo debe incluir dispositivos iOS.
* **Desactive “Disponibilidad en Mac con Apple Silicon” en App Store Connect**: Ejecutar una aplicación iOS en Mac M1 aumenta la exposición del binario de la aplicación y del sandbox.

Para detalles, consulte la guía de Apple sobre [ejecutar sus apps iOS en macOS](https://developer.apple.com/documentation/apple-silicon/running-your-ios-apps-on-macos).

## Protecciones de la aplicación

Endurezca la aplicación de billetera digital durante la compilación y distribución. Enfóquese en sideloading, clonación y manipulación en tiempo de ejecución.

### Validar el entorno de ejecución

* Asegúrese de que la App se ejecute en los dispositivos objetivo con la versión de SO, versión de firmware y versión de hardware soportadas por el SDK.
* Bloquee la ejecución en emuladores y dispositivos jailbreak.&#x20;

  Consulte la guía OWASP MSTG sobre [Defensas anti-reversing en iOS](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md).

### Controlar los canales de distribución

Distribuya la aplicación de billetera digital solo a través de tiendas oficiales y canales verificados.

* La aplicación debe verificar que fue instalada desde la tienda prevista.
* No permita la distribución por canales paralelos (side-channel).

### Aplicar actualizaciones de seguridad (forzar actualización de la aplicación)

Asegure una actualización forzada de la aplicación en caso de correcciones de seguridad.

* Bloquee el acceso al servicio cuando la versión instalada esté por debajo de la versión mínima permitida.

### Detectar manipulación, resignado y clonación

* Detecte cambios en la firma de código (re-signing) y reempaquetado.
* Detecte modificaciones del binario de la aplicación y de los recursos.
  * Consulte la guía OWASP MSTG sobre [Defensas anti-reversing en iOS](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md)
* Vincule los datos sensibles de la aplicación a un dispositivo específico.

Cuando detecte una comprometedora, asegúrese de que la cuenta relacionada sea incluida en la lista negra y se rechacen las transacciones.

### Proteger datos en tránsito

* Use TLS 1.2 o TLS 1.3 para todas las conexiones al backend del emisor.
* Si implementa fijación de certificado, planifique la rotación de certificados.
* Use conjuntos de cifrado fuertes y rechace negociaciones débiles.
* Agregue encriptación a nivel de aplicación cuando sea necesario.

### Agregar protecciones en tiempo de ejecución (RASP)

Asegúrese de que la Protección de Aplicación en Tiempo de Ejecución esté disponible en la aplicación de billetera digital. Detecte depuración y hooking durante operaciones sensibles.

* Consulte la guía OWASP MSTG sobre [Defensas anti-reversing en iOS](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md)

## Proteger activos

Esta sección describe las mejores prácticas en el desarrollo de apps para proteger activos.

#### Token de registro FCM

Si la aplicación de billetera digital gestiona FCM a nivel de app:

* Evite persistir el token de registro FCM más tiempo del necesario.
* Asegure la confidencialidad e integridad de este activo.

#### Información de la tarjeta de financiación

Si la aplicación de billetera digital recopila datos de tarjetas de pago:

* Desactivar características riesgosas de `UITextField` como Autocompletar y copiar/pegar.
* Use un teclado seguro.
* Valide las entradas antes de usarlas.
* No almacene datos de tarjetas de pago de forma persistente.
* Antes de mostrar la pantalla de ingreso, aplique verificaciones en tiempo de ejecución (jailbreak, hooking, depuración y detección de manipulación).
* Asegure la confidencialidad e integridad de este activo.

Aplique los mismos controles a cualquier otra entrada sensible que provenga de fuera de la app.

#### Certificado de firma de la app y certificado TLS

* Controle el acceso al certificado de firma de la app.
* No lo divulgue a partes no confiables.
* Asegure la confidencialidad e integridad de este activo.

#### Otros activos sensibles

* Ofusque el código y proteja las cadenas sensibles incluidas en el binario.
* Reevalúe los activos en cada lanzamiento (nuevas funciones pueden añadir nuevos datos sensibles).
  * Evalúe el valor y la criticidad de cada activo y aplique la protección requerida.
* No persista datos transitorios. Limpie los datos sensibles de la memoria cuando ya no sean necesarios.
* Considere siempre el dispositivo como no confiable. Use RASP para ayudar a proteger el binario de la aplicación y las bibliotecas de terceros en tiempo de ejecución.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/es/security-and-privacy/security-guidance.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
