Alle Open-Source-Pakete
WerkzeugeSwift

iOSSecurityTools

Keychain, Verschlüsselung, Pinning, Einmalcodes und Integritätsprüfungen für Apple-Apps.

5SterneNeueste Version: v2.1.0 · Aktualisiert: 21. Oktober 2026
Plattformen:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

Lizenz: MIT

Tests: 589Gemessen:

Wie gemessen wurde

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.

Zusammenfassung

  • Ein abhängigkeitsfreies Swift-Package mit Bausteinen für fünf Apple-Plattformen: Keychain, Verschlüsselung, Secure Enclave, Pinning, Einmalpasswörter, Integrität und Log-Redaction.
  • Der Log-Redactor von 2.0.0 ließ sich mit ähnlichen Buchstaben, Escapes und als Werte geschriebenen geheimen Namen umgehen, daher sollte man sich bei Logs nicht auf 2.0.0 verlassen.
  • In 2.1.0 werden nur reine ASCII-Schlüssel mit den geheimen Namen verglichen, und der Wert jedes anderen Schlüssels wird standardmäßig verborgen.
  • JSON-, Form- und Multipart-Bodies werden mit Parsern gelesen, und ein Body, der nicht vollständig parst oder über 256 KiB liegt, wird weggelassen.
  • Redaction ist ein Sicherheitsnetz gegen versehentlich geloggte Geheimnisse, keine Garantie gegen jemanden, der ein Geheimnis absichtlich verschleiert.

Ein Swift-Package mit Sicherheitsbausteinen für Apps auf iOS, macOS, tvOS, watchOS und visionOS: Keychain-Speicherung, authentifizierte Verschlüsselung, PIN-Hashes, Secure-Enclave-Schlüssel, Certificate Pinning, Einmalpasswörter, Geräteintegritätsprüfungen und Log-Redaction. Jeder Typ validiert den übergebenen Wert und wirft einen typisierten Fehler, statt abzustürzen; so kann ein Wert aus einem QR-Code, einem Server oder einer Datei die App nicht zu Fall bringen. Es ruft Apples Frameworks direkt auf und hat keine Abhängigkeiten.

Funktionen

  • Keychain speichert Data, Strings und Codable-Werte, erzeugt beim ersten Gebrauch einen 256-Bit-Schlüssel und kann Face ID, Touch ID oder den Passcode verlangen, durchgesetzt vom Keychain selbst
  • DataCipher schreibt AES-256-GCM- oder ChaCha20-Poly1305-Umschläge mit eigener Version, eigenem Algorithmus und eigener Nonce; ein geändertes Byte, ein falscher Schlüssel oder falsche Associated Data lässt die Entschlüsselung fehlschlagen
  • HKDF, PBKDF2 und PIN-Hashes im PHC-Format, mit begrenzter Iterationszahl, damit ein manipulierter Hash die Prüfung nicht stundenlang laufen lassen kann
  • PinningPolicy verlangt einen Backup-Pin, unterstützt Subdomains, Ablaufdaten und einen Report-only-Modus, und verlangt weiterhin, dass die eigene Trust-Bewertung des Systems besteht
  • HOTP und TOTP mit otpauth://-Parsing und -Schreiben, sowie Secure-Enclave-P-256-Schlüssel, um ein Konto an das Gerät zu binden
  • IntegrityInspector meldet Jailbreak-Dateien, einen Debugger, den Simulator, Hooking-Bibliotheken und einen System-Proxy als Signale in einem Codable-Report, nicht als Beweis
  • SensitiveDataRedactor vergleicht nur reine ASCII-Schlüssel mit seinen geheimen Namen und verbirgt den Wert jedes anderen Schlüssels; JSON-, Form- und Multipart-Bodies sowie URLs werden mit Parsern gelesen, und was sich nicht parsen lässt, wird weggelassen
  • @Redacted gibt in Beschreibungen <redacted> aus, und .privacyShield() verdeckt Views im App-Switcher und während der Bildschirmaufnahme

Schnellstart

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}

Installation

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

Screenshots

Ein Log-Text mit einer E-Mail, einem Passwort, einem Bearer-Token und einer Kartennummer, und darunter die maskierte Version
Ein Log-Text mit einer E-Mail, einem Passwort, einem Bearer-Token und einer Kartennummer, und darunter die maskierte Version, Dark Mode
Eine Notiz, die als 46 Bytes in den Keychain verschlüsselt und zurückgelesen wird, und eine PIN, die gegen ihren gespeicherten Hash geprüft wird
Integritätsbericht im Simulator: Jailbreak-Prüfung nicht anwendbar, Simulator erkannt; Debugger, injizierte Bibliotheken und Proxy sauber
Ein sechsstelliger TOTP-Code aus einer otpauth-URI mit einem Ring, der die verbleibenden Sekunden herunterzählt
Eine Kartendetails-Ansicht, verdeckt vom Privacy Shield mit einem Schloss-Symbol

Zeitleiste

  1. Repository eröffnet mit AES- und RSA-Verschlüsselungshelfern

  2. v1.0.0 veröffentlicht; eine andere Codebasis als das heutige Paket

  3. Bereinigung: Die 1.0.0-Quellen wurden durch Platzhaltercode ersetzt

  4. Von Grund auf neu aufgebaut als 2.0.0: Keychain, Verschlüsselung, Secure-Enclave-Schlüssel, Biometrics, Pinning, Einmalpasswörter, Integritätsprüfungen und Log-Redaction; nichts von der 1.0.0-API blieb erhalten

  5. 2.1.0: Der Log-Redactor wurde neu entworfen, nachdem sich zeigte, dass 2.0.0 umgangen werden konnte; Schlüssel, die nicht reines ASCII sind, werden standardmäßig verborgen, und Bodies und URLs werden mit Parsern gelesen

Links

Verwandter Artikel

Artikel lesen