iOS Security Tools
Keychain, cifrado, pinning, códigos de un solo uso y comprobaciones de integridad para apps de Apple.
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
1import SwiftUI2import iOSSecurityTools3 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.localizedDescription20 }21 }22 .buttonStyle(.borderedProminent)23 }24 .padding()25 .privacyShield()26 }27}Instalación
Swift Package Manager
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
1https://github.com/muhittincamdali/iOSSecurityTools.gitCapturas de pantalla






Cronología
Repositorio abierto con ayudantes de cifrado AES y RSA
v1.0.0 publicada; una base de código distinta a la del paquete actual
Limpieza: las fuentes de 1.0.0 se sustituyeron por código placeholder
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
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