Todos los paquetes de código abierto
HerramientasSwift

iOSSecurityTools

Keychain, cifrado, pinning, códigos de un solo uso y comprobaciones de integridad para apps de Apple.

5EstrellasÚltima versión: v2.1.0 · Actualizado: 21 de octubre de 2026
Plataformas:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

Licencia: MIT

Pruebas: 589Medido:

Cómo se midió

swift test at PR #25 head 5b71c19 (the planned v2.1.0, not yet tagged) on macOS 27.0.1, Apple Swift 6.4: "Test run with 589 tests in 101 suites passed after 370.336 seconds". Re-run at the v2.1.0 tag before publishing.

Resumen

  • Un paquete Swift sin dependencias con bloques para cinco plataformas Apple: keychain, cifrado, Secure Enclave, pinning, contraseñas de un solo uso, integridad y redaction de logs.
  • El log redactor de 2.0.0 podía evadirse con letras parecidas, escapes y nombres secretos escritos como valores, así que no debe confiarse en 2.0.0 para logs.
  • En 2.1.0 solo se comparan con los nombres secretos las claves en ASCII puro, y el valor de cualquier otra clave se oculta por defecto.
  • Los bodies JSON, form y multipart se leen con parsers, y un body que no se analiza por completo o supera los 256 KiB se omite.
  • Redaction es una red de seguridad contra secretos registrados por accidente, no una garantía contra alguien que disfraza un secreto a propósito.

Un paquete Swift de bloques de construcción de seguridad para apps en iOS, macOS, tvOS, watchOS y visionOS: almacenamiento en keychain, cifrado autenticado, hashes de PIN, claves de Secure Enclave, certificate pinning, contraseñas de un solo uso, comprobaciones de integridad del dispositivo y redaction de logs. Cada tipo valida lo que recibe y lanza un error tipado en lugar de fallar, de modo que un valor proveniente de un código QR, un servidor o un archivo no puede colgar la app. Llama directamente a los frameworks de Apple y no tiene dependencias.

Características

  • Keychain almacena data, strings y valores Codable, crea una clave de 256 bits en el primer uso y puede exigir Face ID, Touch ID o el passcode, impuesto por el propio keychain
  • DataCipher escribe sobres AES-256-GCM o ChaCha20-Poly1305 con su propia versión, algoritmo y nonce; un byte cambiado, una clave equivocada o un associated data incorrecto hace fallar el descifrado
  • HKDF, PBKDF2 y hashes de PIN en formato PHC, con el número de iteraciones acotado para que un hash manipulado no pueda hacer que la verificación tarde horas
  • PinningPolicy exige un pin de respaldo, admite subdominios, fechas de expiración y un modo report-only, y sigue exigiendo que pase la propia evaluación de confianza del sistema
  • HOTP y TOTP con lectura y escritura de otpauth://, y claves P-256 de Secure Enclave para vincular una cuenta al dispositivo
  • IntegrityInspector informa archivos de jailbreak, un debugger, el simulador, bibliotecas de hooking y un proxy del sistema como señales en un informe Codable, no como prueba
  • SensitiveDataRedactor compara solo claves en ASCII puro con sus nombres secretos y oculta el valor de cualquier otra clave; los bodies JSON, form y multipart, y las URLs, se leen con parsers, y lo que no se puede analizar se omite
  • @Redacted imprime <redacted> en las descripciones, y .privacyShield() cubre las vistas en el app switcher y durante la grabación de pantalla

Inicio rápido

swift
1import SwiftUI
2import iOSSecurityTools
3 
4struct ContentView: View {
5 @State private var status = "Nothing stored yet"
6 
7 var body: some View {
8 VStack(spacing: 16) {
9 Text(status)
10 Button("Encrypt and store a note") {
11 do {
12 let keychain = Keychain(service: "QuickStart")
13 let cipher = try DataCipher(key: keychain.symmetricKey(forKey: "notes-key"))
14 try keychain.set(cipher.encrypt("Meet at 7 pm"), forKey: "note")
15 
16 let stored = try keychain.data(forKey: "note") ?? Data()
17 status = "Decrypted: \(try cipher.decryptString(stored))"
18 } catch {
19 status = error.localizedDescription
20 }
21 }
22 .buttonStyle(.borderedProminent)
23 }
24 .padding()
25 .privacyShield()
26 }
27}

Instalación

Swift Package Manager

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/iOSSecurityTools.git", from: "2.1.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "iOSSecurityTools", package: "iOSSecurityTools")
7 ])
8]

Xcode

text
1https://github.com/muhittincamdali/iOSSecurityTools.git

Capturas de pantalla

Un texto de log con un email, una contraseña, un bearer token y un número de tarjeta, y debajo la versión con los valores ocultos
Un texto de log con un email, una contraseña, un bearer token y un número de tarjeta, y debajo la versión con los valores ocultos, en modo oscuro
Una nota cifrada en el keychain como 46 bytes y leída de vuelta, y un PIN comprobado contra su hash almacenado
Informe de integridad en el simulador: comprobación de jailbreak no aplicable, simulador detectado; debugger, bibliotecas inyectadas y proxy sin hallazgos
Un código TOTP de seis dígitos a partir de una URI otpauth con un anillo que cuenta los segundos restantes
Una vista de datos de tarjeta cubierta por el privacy shield con un símbolo de candado

Cronología

  1. Repositorio abierto con ayudantes de cifrado AES y RSA

  2. v1.0.0 publicada; una base de código distinta a la del paquete actual

  3. Limpieza: las fuentes de 1.0.0 se sustituyeron por código placeholder

  4. Reconstruido desde cero como 2.0.0: keychain, cifrado, claves de Secure Enclave, biometrics, pinning, contraseñas de un solo uso, comprobaciones de integridad y redaction de logs; no se conservó nada de la API de 1.0.0

  5. 2.1.0: el log redactor se rediseñó después de que se demostrara que 2.0.0 se podía evadir; las claves que no son ASCII puro se ocultan por defecto, y los bodies y las URLs se leen con parsers

Enlaces

Artículo relacionado

Leer el artículo