Xcode11 Swift5 CryptoKit SymmetricKey exportieren und importieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Xcode11 Swift5 CryptoKit SymmetricKey exportieren und importieren

    Hallo,

    nachdem ich nun die ersten Erfahrungen mit dem CryptoKit durchlaufen habe - sind, wie konnte es auch anders sein - die ersten Fragen aufgetaucht.

    Die symmetrische Ver- und Entschlüsselung funktioniert. Geprüft habe ich dies, indem ich die Daten in der Konsole ausgegeben habe. Soweit so gut. Als ich jedoch mit dem Debugger den erzeugten Schlüssel betrachten wollte, war dieser zu jedem Zeitpunkt leer. ?( Dies kann doch gar nicht sein? Ich gehe mal davon aus, dass dieser in einem Container untergebracht ist.

    Falls ich mit dieser Annahme richtig liege, wie kann ich diesen Schlüssel exportieren und wo sollte ich diesen am besten speichern (evtl. in einer .plist - ist aber glaube ich, nicht die beste Idee; fest codiert innerhalb der App)?

    Wie importiere ich den gespeicherten Schlüssel um anschließend die Daten zu entschlüsseln?

    Erzeugt wird der Schlüssel i.A. so:

    Quellcode

    1. var key = SymmetricKey(size: .bits256)
    Gelesen habe ich irgendwo, dass man den Schlüssel auch direkt angeben kann - mit SymmetricKey(data: Schlüssel). Dies funktioniert jedoch bei mir nicht und ich bin hier noch am grübeln warum dies so ist. Vielleicht kann mir jemand hierzu auch einen Tipp geben.


    Nachtrag:
    Ich muss öfters hier etwas posten, dann findet sich die Lösung hin und wieder von selbst. :)
    Also einen eigenen Schlüssel verwenden funktioniert nun. Bleibt noch die Frage offen, wie ich einen, mit obigen Code, erzeugten Schlüssel exportieren und importieren kann und wo ich diesen am besten speichere.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • MyMattes schrieb:

    Gibt‘s da nicht eine Methode withUnsafeBytes? Das hat mir zumindest SO nach Googlen eines ersten Suchbegriffs ausgespuckt...

    Mattes
    Ja, diese habe ich auch gefunden. Aber irgendwie komme ich damit nicht klar.


    Quellcode

    1. let savedKey = key.withUnsafeBytes { Data(Array($0)) }
    Obige Zeile gibt mir die Länge des Schlüssels in Byte zurück. Damit lässt sich nicht wirklich viel anfangen. Da beim zurücksichern des Schlüssel der Datentyp: Data vorgegeben ist. ?(
  • Hmmm, ist doch viel einfacher als ich mir dies wieder einmal überlegt hatte.

    Anbei die Lösung.

    Quellcode

    1. let savedKey = key.withUnsafeBytes { Data(Array($0)).base64EncodedString().utf8CString }

    Nachtrag:
    Beim zurücksichern des gesicherten Schlüssel erhalte ich eine um 12 Bytes differierende Länge des Schlüssels. Der original Schlüssel hat eine Länge von 32 Bytes. Der gesicherte Schlüssel hat eine Länge von 44 Bytes? ?(

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • Quellcode

    1. let savedKey = key.withUnsafeBytes { Data(Array($0)).base64EncodedString() }
    Wenn ich .utf8String nicht verwende, dann funktioniert der Import und die Entschlüsselung einwandfrei. Ansonsten erhalte ich beim importieren des Schlüssel aus bis dato nicht nachvollziehbaren Gründen immer genau 12 Bytes mehr zurück als erwartet. ;(

    Nachtrag:
    Bleibt noch die Frage offen, wo speichere ich den Schlüssel? Besten Dank für jede Anregung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag

  • OSXDev schrieb:

    Bleibt noch die Frage offen, wo speichere ich den Schlüssel? Besten Dank für jede Anregung.
    Ich würde derartige Informationen ausschließlich in der KeyChain sichern. Sofern Du einen Schlüsselaustausch zwischen zwei Parteien benötigst, bietet sich an, den symmetrischen Schlüssel über eine asymmetrische Verschlüsselung auf Basis Public / Private Keys auszutauschen.

    Sorry, ich kann Dir aber nicht bei einer konkreten Implementierung mittels CryptoKit helfen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    OSXDev schrieb:

    Bleibt noch die Frage offen, wo speichere ich den Schlüssel? Besten Dank für jede Anregung.
    Ich würde derartige Informationen ausschließlich in der KeyChain sichern. Sofern Du einen Schlüsselaustausch zwischen zwei Parteien benötigst, bietet sich an, den symmetrischen Schlüssel über eine asymmetrische Verschlüsselung auf Basis Public / Private Keys auszutauschen.
    Sorry, ich kann Dir aber nicht bei einer konkreten Implementierung mittels CryptoKit helfen...

    Mattes
    Alles gut, Mattes.

    Das werde ich schon selbst in den Griff bekommen. Die Mathematik dahinter, ist ja auch kein Hindernis. Ein helfender Hinweis hin und wieder ist völlig ausreichend.