2017-02-22 4 views
1

Ich arbeite an IOS-Anwendung, die einige Dateien enthält, die AES-128 verschlüsselt sind, so zum Entschlüsseln dieser Dateien verwende ich einige Drittanbieter-Bibliotheken wie Cryptoswift, gerade jetzt in schneller Code nur ich schreibe meine eigene Logik, um Daten mit Schlüsseln zu entschlüsseln, aber ich möchte diese Schlüssel sicher speichern, für Android hatte ich meine Logik in nativer Bibliothek geschrieben, hier, was ist der beste Weg, um meinen geheimen Schlüssel zu sichernSo speichern Sie vorhandene Zeichenfolge heimlich in IOS Swift App

+0

Es ist am besten zu vermeiden, CryptoSwift zu verwenden, unter anderen Dingen ist es 100 bis 1000 mal langsamer als Common Crypto-basierte Implementierungen. Apples Common Crypto ist FIPS-zertifiziert und wurde daher gründlich geprüft. CryptoSwift nimmt die Chance auf Korrektheit und Sicherheit. – zaph

+0

Sie können Ihren Schlüsselspeicher in Ihrem Code verschleiern; Speichern Sie es in mehrere Teile, speichern Sie es in einer Form, die einige mathematische Operationen benötigt, um den Schlüssel wiederherzustellen usw. Dies wird es für einen Angreifer schwieriger, Ihren Schlüssel zu extrahieren, aber es gibt wenig, was Sie tun können, um sich vor einem entschlossenen Angreifer zu schützen letztlich ist der Schlüssel irgendwo da. – Paulw11

+0

@ Paulw11 Die Verteidigung gegen den Besitzer ist im Prinzip unmöglich, aber die Verteidigung gegen jemand anderen mit physischem Besitz hängt von der Qualität des Sperrcodes ab. Ein gesperrtes Gerät ist gegen praktisch jeden Angreifer sicher. – zaph

Antwort

4

Sie sollten die iOS Keychain Services verwenden, um die Schlüssel sicher zu speichern.

In Swift sind mehrere Bibliotheken implementiert, die einen einfachen Zugriff auf die Schlüsselkette ermöglichen. Siehe hier: https://github.com/vsouza/awesome-ios#keychain

+0

wie ich meinen schlüssel zu keychain hinzufügen, wenn ich diese Logik in swift schreiben, kann jeder diesen Schlüssel sehen – skyshine

+0

Das hängt von der Architektur Ihres Schlüsselgenerierungsmechanismus ab ... Wenn Sie den Schlüssel auf dem Gerät zum Beispiel erstellen, müssen Sie nie schreiben der Schlüssel in den Swift-Code. Wenn Sie vorgenerierte Schlüssel haben, müssen Sie diese mit der App versehen und den Benutzer zum Beispiel nach einem Passwort fragen. – aofs

+0

@parker Definieren Sie "irgendjemand"? Der Besitzer des Geräts kann, da sie Besitz und volle Kontrolle haben. Gleiches gilt für Geräte ohne Sperrcode. Die Sicherung durch den Benutzer erfordert DRM, nicht nur Verschlüsselung. – zaph

0

Zum Speichern sensibler Informationen sollten Sie den Keychain immer verwenden.Sie können den folgenden von Apple geposteten Beispielcode verwenden, um ausführlich zu wissen Generic Keychain .Happy Coding !!!

-1

EDIT: Siehe die Diskussion darunter. Kluge Schlussfolgerung: Vielleicht ist die beste Antwort "stört nicht, steckt den Schlüssel in den Code", es gibt einen großen Arbeitsfaktor, um den Schlüssel zu erhalten.

Wenn Sie ein geheimes Token in der App speichern, besteht die Gefahr, dass es als einfache Zeichenfolge leicht wiederhergestellt werden kann. Sie können mehr darüber unter Reverse Engineering iOS Apps lesen.

Sie können es nicht ganz verhindern, aber Sie können Kennwortdaten verschleiern durch Passwort in kleinere Stücke, halten sie auseinander in dem Code, und verwenden Sie einige dumb-Entschlüsselungsalgorithmus zur endgültigen Form abzurufen, wie folgt aufgeteilt:

func crypt(string: String) -> [UInt32] { 
    return string.unicodeScalars.enumerated().map { index, char in 
     return char.value + UInt32(index) 
    } 
} 

func decrypt(chars: [UInt32]) -> String { 
    return chars.enumerated().map { (index, char) -> String in 
     let s = UnicodeScalar(char - UInt32(index))! 
     return "\(Character(s))" 
    }.joined() 
} 

let clearPassword = "Acb,321" 
let cryptedChars = crypt(string: clearPassword) 
let decrypted = decrypt(chars: cryptedChars) 

let c1: UInt32 = 65 
let c2: UInt32 = 100 
let c3: UInt32 = 100 
let c4: UInt32 = 47 
let c5: UInt32 = 55 
let c6: UInt32 = 55 
let c7: UInt32 = 55 

let decryptedScattered = decrypt(chars: [c1, c2, c3, c4, c5, c6, c7]) 

Nicht perfekt, aber sollte für einfache Angriffe ausreichen, und fortgeschrittenere wäre wahrscheinlich zu teuer, um fortzufahren.

+0

Es ging Ihnen gut, bis Sie "einen Algorithmus zur Dumb-Entschlüsselung verwenden". – zaph

+0

@zaph Und könnten Sie mehr ausarbeiten, warum? Auf welche andere Weise schlagen Sie vor, ein Token in einer Binärdatei zu speichern? Schlüsselbund ist nur zur Laufzeit verfügbar, nicht zur Kompilierungszeit. Ein zufälliger Schlüssel, den Sie oben vorgeschlagen haben, löst das Problem überhaupt nicht, wenn Sie Dateien bereits mit einem bestimmten Geheimnis verschlüsselt haben. –

+0

Warum "einige Dumb-Entschlüsselung Algorithmus" verwenden, wenn AES verfügbar ist? Das Wort "dumm" sagt alles. – zaph

Verwandte Themen