Verschlüsselung mit CryptoSwift/RNCryptor

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

  • Verschlüsselung mit CryptoSwift/RNCryptor

    Hey Leute,

    ich habe nicht unbedingt ein Problem, sondern eher eine Unverständlichkeit.

    Und zwar verschlüsselt ich mit folgendem einen eingegebenen Text mittels AES128-Bit:

    Quellcode

    1. func passwordVerschluesseln(){
    2. let input = tfPassword.text!
    3. let key = "ENTFERNT"
    4. let iv = "ENTFERNT"
    5. let en = try! input.aesEncrypt(key: key, iv: iv)
    6. self.cryptedPw = en
    7. print("Verschlüsseltes Pw: ", cryptedPw)
    8. return
    9. }





    Quellcode

    1. extension String{
    2. func aesEncrypt(key: String, iv: String) throws -> String {
    3. let data = self.data(using: .utf8)!
    4. let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
    5. let encryptedData = Data(encrypted)
    6. return encryptedData.base64EncodedString()
    7. }
    8. func aesDecrypt(key: String, iv: String) throws -> String {
    9. let data = Data(base64Encoded: self)!
    10. let decrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).decrypt([UInt8](data))
    11. let decryptedData = Data(decrypted)
    12. return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt"
    13. }
    14. }
    Alles anzeigen

    Nun lautet der String des verschlüsselten Textes:

    Quellcode

    1. Verschlüsseltes Pw: 1xCgOJ/V+jJyUFgKvaLpDg==

    Nun übermittel ich den verschlüsselten Text an ein .php File, welches diesen Text in die Datenbank einträgt:


    Quellcode

    1. let urlString = "http://BLA.de/Database/register.php?username=\(tfUsername.text!)&password=\(cryptedPw)&mail=\(tfMail.text!)&realname=\(tfRealname.text!)"
    2. let url = URL(string: urlString)
    3. var request = URLRequest(url: url!)
    4. let session = URLSession.shared
    5. // Task wich gets The Data from The PHP-File
    6. let task = session.dataTask(with: request, completionHandler: { (data, response, error) in

    Das Password wird allerdings nicht korrekt gespeichert.

    In der Datenbank lautet mein Password folgendermaßen:

    Quellcode

    1. 1xCgOJ/V jJyUFgKvaLpDg==

    Kurzgefasst:

    Das Password bzw irgendwo bei der Übertragung wird der Verschlüsselte Text verändert, da das + , die bei dem verschlüsseltem Text enthalten sind, werden einfach durch ein Leerzeichen ersetzt. Dies passiert auch, wenn ich die Daten mittels POST übermittle bzw. dem Body separat hinzufüge (Da fällt mir der name nur grad nicht ein)

    Hätte da jemand eine Idee, woran es liegen könnte??

    PS: Wenn der Text in der Verschlüsselten Variante kein + enthält, wird es korrekt in der Datenbank hinterlegt.

    Grüße Lenon!
  • matz schrieb:

    URL-Encoding lautet das Stichwort.
    Es ist übrigens eine Schei*-Idee solche Dateien per URL-Parameter zu übergeben.
    Ja ist mir leider bekannt, dass es scheiße ist... Leider bin ich in mit Swift nicht so vertraut. Ich hatte es damals in Java über Post etc. gemacht, aber irgendwie bin ich für den scheiß zu dumm, ich kapier das ganze nich so richtig in Swift haha :D
  • Thallius schrieb:

    matz schrieb:

    URL-Encoding lautet das Stichwort.
    Es ist übrigens eine Schei*-Idee solche Dateien per URL-Parameter zu übergeben.
    Ich finde es eine noch größere Scheiß Idee eine symetrische Verschlüsselung zu benutzen....

    kleines Nebenkommentar.. Muss nicht unbedingt gelesen werden...
    Spoiler anzeigen
    Ich finde es auch eine große, scheiße, dass hier nur wieder drüber diskutiert werden muss, dass meine Übertragung etc, scheiße ist... Wenn ihr schon so "Tolle-HARDCORE-PROGRAMMIERER" seid, dann gebt doch wenigstens tipps, wie ich es besser machen könnte. Aber solche Leute sind mir die besten... Sorry, aber warum könnt ihr nicht wenigstens etwas zum Eigentlichen Thema Beitragen.. Klar, regt ein Beitrag zu Diskussionen an, dann sollte man aber wenigstens auch zur Lösung des Problems, bzw. der eigentlichen Frage etwas beitragen.

    Letztendlich ist die Verschlüsselung meiner Daten meine Sache. Ich bitte euch drum, wenn ihr meine Arbeitsweise schon zum kotzen findet, dann gebt mir verdammte scheiße doch einfach auch einen Tipp, wie es ein Anfänger besser machen kann?!... Mein Gott ey... Sorry aber das musste jetzt auch mal raus... Leider passiert das hier öfters-.-


    Um zum eigentlichen Thema und zu dem Beitrag von Thalias zurückzukommen:

    Ich habe es jetzt folgendermaßen versucht, was mir leider immer noch das gleiche "Problem" bringt... Irgendwie kommt das Plus aber nur bei einem bestimmten Wort vor haha...

    Quellcode

    1. let urlwithPercentEscapes = urlString.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed)

    War ich damit überhaupt auf dem richtigen Weg? Wie gesagt, ich bin in Swift noch relativ neu und habe "Umstellungsschwierigkeiten" von meiner gewohnten Programmiersprache..
  • Du willst es ja nicht hören aber das was du machst ist mehr als Schwachsinn. Wenn du dein Passwort verschlüsselt aber genauso eine Methode hast zum entschlüsseln dann kannst du dir das verschlüsseln auch sparen. Das ist so wie wenn du ein Schlüssel für deine Wohnung hast und dann den 2 Schlüssel vor deine Tür legst. Wenn du das entschlüsseln hinbekommst warum dann nicht auch jemand anderes?

    Ich war damals auch neu und da gab es noch kein Swift - nur Objective C aber sowas kann man nicht machen

    Wenn du bei Google nach "post request Swift" googlest da findest du Massen. Davon abgesehen sollte man das als einen Hash machen und dann noch mal "Salzen". Ein Passwort sollte man so verschlüsseln, dass es nicht mehr so einfach entschlüsselt werden kann. Klar 100% Sicherheit gibt es nicht aber man kann wenigstens das so machen dass es so gut wie unmöglich ist.
  • AppleDeveloper schrieb:

    Du willst es ja nicht hören aber das was du machst ist mehr als Schwachsinn. Wenn du dein Passwort verschlüsselt aber genauso eine Methode hast zum entschlüsseln dann kannst du dir das verschlüsseln auch sparen. Das ist so wie wenn du ein Schlüssel für deine Wohnung hast und dann den 2 Schlüssel vor deine Tür legst. Wenn du das entschlüsseln hinbekommst warum dann nicht auch jemand anderes?

    Ich war damals auch neu und da gab es noch kein Swift - nur Objective C aber sowas kann man nicht machen

    Wenn du bei Google nach "post request Swift" googlest da findest du Massen. Davon abgesehen sollte man das als einen Hash machen und dann noch mal "Salzen". Ein Passwort sollte man so verschlüsseln, dass es nicht mehr so einfach entschlüsselt werden kann. Klar 100% Sicherheit gibt es nicht aber man kann wenigstens das so machen dass es so gut wie unmöglich ist.
    Im Vorab, möchte ich klarstellen, dass ich nicht darum gebeten habe, meine Verschlüsselung zu beurteilen. Ich wollte wissen, warum die Daten nicht richtig abgespeichert werden.

    Ich habe nichts gegen Beschwerden, egal wie hart die auch sein mögen, aber bitte beschäftigt euch dann mit meiner anderen Frage...
  • Lenon schrieb:

    Im Vorab, möchte ich klarstellen, dass ich nicht darum gebeten habe, meine Verschlüsselung zu beurteilen. Ich wollte wissen, warum die Daten nicht richtig abgespeichert werden.
    Wenn man Verschlüsselung falsch benutzt, ist sie halt kaputt.

    Lenon schrieb:

    Ich habe nichts gegen Beschwerden, egal wie hart die auch sein mögen, aber bitte beschäftigt euch dann mit meiner anderen Frage...
    Die hat Dir bereits der Matz und der AD beantwortet... Und wenn Du es als POST schicken würdest, hättest Du auch die Hälfte der Probleme nicht. Und wenn Du TLS verwenden würdest (wie 6-8 Mal empfohlen), hättest Du auch keine Verschlüsselungsprobleme mehr. Das wurde Dir alles mehrfach von verschiedenen Personen durchgekaut.
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NSObject ()

  • gritsch schrieb:

    du sollst auch nur die componente encoden und nicht die ganze url!

    aber wie schon gesagt ist das sowas von unsicher. nimm zumindest https und POST anstatt http und GET!
    Vielen Dank! Jetzt hat es geklappt.

    Ja das es unsicher ist weis ich. mit https, wird es grade nichts, weil mein Server beim "aufspielen" des Zertifikates immer abstürzt, deswegen nur HTTP.. POST wird auch noch gemacht, aber in erster Linie geht es mir darum, die Grundfunktionen hin zu bekommen.. Da ich die App nur für mich programmiere, langt es anfangs, dies etwas unsicher zu gestalten, da nichts wirklich dramatisches "geklaut" werden kann..

    Wie gesagt, erst einmal programmiere ich die Grundfunktionen, damit es halbwegs funktioniert, und dann geht es in das Detailliertere Zeugs, welches sich auch mit der Sicheren Übertragung etc beschäftigt!

    Aber Danke! :)
  • NSObject schrieb:

    Lenon schrieb:

    Im Vorab, möchte ich klarstellen, dass ich nicht darum gebeten habe, meine Verschlüsselung zu beurteilen. Ich wollte wissen, warum die Daten nicht richtig abgespeichert werden.
    Wenn man Verschlüsselung falsch benutzt, ist sie halt kaputt.
    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.

    In dem von dir Zitierten Satz, wollte ich eigentlich ausdrücken, warum die Verschlüsselung beurteilt wird, wenn nach der Übertragung gefragt wird. Die Verschlüsselung an sich funktioniert ja, wie in meinem ersten Beitrag erwähnt wurde. Das Password wird korrekt verschlüsselt und ausgegeben, jedoch wird bzw. wurde in der Datenbank lediglich ein Character weggelassen. Ich denke jetzt mal nicht, dass das an der Verschlüsselung gelegen hätte, wenn ein String zuvor richtig verschlüsselt und ausgegeben wurde, und dann innerhalb der "URL_Methode" falsch verschlüsselt wird.
  • gritsch schrieb:

    Und wie fügst du die daten in die datenbank ein?

    Ich tippe auf "INSERT INTO users (username, password) VALUES ('$username', '$password');"?
    Nein Die Daten werden mittels uff wie heisst das noch gleich...

    Quellcode

    1. bind_params oder so
    zu einem prepared statement oder so eingetragen, weis das gerade nicht auswendig...
  • Lenon schrieb:

    NSObject schrieb:

    Lenon schrieb:

    Im Vorab, möchte ich klarstellen, dass ich nicht darum gebeten habe, meine Verschlüsselung zu beurteilen. Ich wollte wissen, warum die Daten nicht richtig abgespeichert werden.
    Wenn man Verschlüsselung falsch benutzt, ist sie halt kaputt.
    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.
    *facepalm* Wie beurteilst Du, dass Du die richtig benutzt...?

    Hast Du Dich, wie von MyMattes angeregt, in die Grundlagen der Kryptographie eingelesen? Wie Initalisierst Du den IV? Wie überträgst Du den IV? Wie erzeugst Du den Key? Wie überträgst Du den Key? Wie ist der Key gesichert? Etc. Hier weiterlesen.
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NSObject ()

  • Lenon schrieb:

    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.

    Ich beiße hier gerade in die Tischkannte... =O

    Der Punkt ist: Du verschlüsselst gar nicht!!!

    Du schickst die User-Credentials im Netz für jeden mitlesbar im Klartext raus! Du wandelst ein Paßwort um, ja, aber dieses umgewandelte Paßwort kann jeder mitlesen und verwenden! Ohne Transportverschlüsselung gaukelst Du Dir nur selber etwas vor, was nicht da ist.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Lenon schrieb:

    Hey Leute,

    ich habe nicht unbedingt ein Problem, sondern eher eine Unverständlichkeit.

    Und zwar verschlüsselt ich mit folgendem einen eingegebenen Text mittels AES128-Bit:

    Quellcode

    1. func passwordVerschluesseln(){
    2. let input = tfPassword.text!
    3. let key = "ENTFERNT"
    4. let iv = "ENTFERNT"
    5. let en = try! input.aesEncrypt(key: key, iv: iv)
    6. self.cryptedPw = en
    7. print("Verschlüsseltes Pw: ", cryptedPw)
    8. return
    9. }

    NSObject schrieb:

    Lenon schrieb:

    NSObject schrieb:

    Lenon schrieb:

    Im Vorab, möchte ich klarstellen, dass ich nicht darum gebeten habe, meine Verschlüsselung zu beurteilen. Ich wollte wissen, warum die Daten nicht richtig abgespeichert werden.
    Wenn man Verschlüsselung falsch benutzt, ist sie halt kaputt.
    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.
    Wie beurteilst Du, dass Du die richtig benutzt? Hast Du Dich, wie von MyMattes angeregt, in die Grundlagen der Kryptographie eingelesen? Wie Initalisierst Du den IV? Wie überträgst Du den IV? Wie erzeugst Du den Key? Wie überträgst Du den Key? Wie ist der Key gesichert? Etc. Hier weiterlesen.
    Der Key, sowie der IV, werden via "HIER KEY ODER IV" als "String" wenn ich es so nennen kann, eingegeben und so auch verarbeitet. Das ver, sowie entschlüsseln funktioniert. Dennoch verstehe ich noch immer nicht, was das mit der eigentlichen Frage zu tun hatte.. Ich möchte eigentlich ungern ne neue Diskussion da aufmachen, aber das war mir einfach unklar, da das Password verschlüsselt und zumindest richtig entschlüsselt wurde, es jedoch nur in der Übertragung einen Fehler gab..


    naja, wie von MyMattes angeregt, habe ich mich nicht direkt in die Grundlagen eingelesen, aber zumindest eine AES-Verschlüsselung angewendet, welche ja auch funktioniert :) Ich glaube wir 2 haben einfach ein bisschen aneinander vorbei geredet.
  • Lenon schrieb:

    Der Key, sowie der IV, werden via "HIER KEY ODER IV" als "String" wenn ich es so nennen kann, eingegeben und so auch verarbeitet. Das ver, sowie entschlüsseln funktioniert. Dennoch verstehe ich noch immer nicht, was das mit der eigentlichen Frage zu tun hatte.. Ich möchte eigentlich ungern ne neue Diskussion da aufmachen, aber das war mir einfach unklar, da das Password verschlüsselt und zumindest richtig entschlüsselt wurde, es jedoch nur in der Übertragung einen Fehler gab..

    naja, wie von MyMattes angeregt, habe ich mich nicht direkt in die Grundlagen eingelesen, aber zumindest eine AES-Verschlüsselung angewendet, welche ja auch funktioniert :) Ich glaube wir 2 haben einfach ein bisschen aneinander vorbei geredet.
    Kurzantwort zu deinen Aussagen: Nein.
    * Kann Spuren von Erdnüssen enthalten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von NSObject ()

  • torquato schrieb:

    Lenon schrieb:

    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.
    Ich beiße hier gerade in die Tischkannte... =O

    Der Punkt ist: Du verschlüsselst gar nicht!!!

    Du schickst die User-Credentials im Netz für jeden mitlesbar im Klartext raus! Du wandelst ein Paßwort um, ja, aber dieses umgewandelte Paßwort kann jeder mitlesen und verwenden! Ohne Transportverschlüsselung gaukelst Du Dir nur selber etwas vor, was nicht da ist.
    ist AES-128bit keine Verschlüsselung?

    Das umgewandelte Password, kann zwar mitgelesen werden, aber was bringt ein Gewirre aus unterschiedlichen Zeichen, wenn der, der es in der Hand hat, nicht weis, was es bedeutet? ohne den KEY und IV kann es ja nur "schlecht" entschlüsselt werden. im Grunde ist das doch bei jeder im Netz verschlüsselten Datei so? Man sendet ein Gewirre aus Zeichen, die dann wieder mittels KEY entschlüsselt werden, nach deiner Aussage, kann man ja selbst die Daten von Twitter Facebook etc auch einfach mitlesen und verwenden (Zumindest das Gewirre, was ja auch stimmt).

    Daten werden nicht im Klartext übermittelt.

    NSObject schrieb:

    Lenon schrieb:

    Der Key, sowie der IV, werden via "HIER KEY ODER IV" als "String" wenn ich es so nennen kann, eingegeben und so auch verarbeitet. Das ver, sowie entschlüsseln funktioniert. Dennoch verstehe ich noch immer nicht, was das mit der eigentlichen Frage zu tun hatte.. Ich möchte eigentlich ungern ne neue Diskussion da aufmachen, aber das war mir einfach unklar, da das Password verschlüsselt und zumindest richtig entschlüsselt wurde, es jedoch nur in der Übertragung einen Fehler gab..

    naja, wie von MyMattes angeregt, habe ich mich nicht direkt in die Grundlagen eingelesen, aber zumindest eine AES-Verschlüsselung angewendet, welche ja auch funktioniert :) Ich glaube wir 2 haben einfach ein bisschen aneinander vorbei geredet.
    Kurzantwort zu deinen Aussagen: Nein.
    Danke! :) Ja so ein bisschen kenn ich mich da schon aus.. Zumindest so den groben Ansatz.. "Berufskolleg für Informations- und Kommunikationstechnik-Wissen" Aber hilft mir auf jeden Fall schon mal ein bisschen weiter, wenn ich mich nach den Grundfunktionen tiefer in die Materie begebe..
  • Lenon schrieb:

    torquato schrieb:

    Lenon schrieb:

    Die Verschlüsselung an sich wird bzw. wurde nicht falsch benutzt. (Oder sie wird falsch benutzt.. Aber auf jeden Fall funktioniert die Verschlüsselung einwandfrei). Ich Verstehe diesen Satz nicht ganz.
    Ich beiße hier gerade in die Tischkannte... =O
    Der Punkt ist: Du verschlüsselst gar nicht!!!

    Du schickst die User-Credentials im Netz für jeden mitlesbar im Klartext raus! Du wandelst ein Paßwort um, ja, aber dieses umgewandelte Paßwort kann jeder mitlesen und verwenden! Ohne Transportverschlüsselung gaukelst Du Dir nur selber etwas vor, was nicht da ist.
    ist AES-128bit keine Verschlüsselung?
    Das umgewandelte Password, kann zwar mitgelesen werden, aber was bringt ein Gewirre aus unterschiedlichen Zeichen, wenn der, der es in der Hand hat, nicht weis, was es bedeutet? ohne den KEY und IV kann es ja nur "schlecht" entschlüsselt werden. im Grunde ist das doch bei jeder im Netz verschlüsselten Datei so? Man sendet ein Gewirre aus Zeichen, die dann wieder mittels KEY entschlüsselt werden, nach deiner Aussage, kann man ja selbst die Daten von Twitter Facebook etc auch einfach mitlesen und verwenden (Zumindest das Gewirre, was ja auch stimmt).


    Jetzt überleg doch einfach einmal was du da machst. Du verschlüsselst das Passwort und schickst das an den server der dass dann in welcher Form auch immer verwendet um den User damit einzuloggen. Dabei ist es total egal ob der das entschlüsselt nochmal verschlüsselt hashed oder gleich wegwirft...


    Fakt ist:


    Wenn ich das verschlüsselte Passwort abfange und das ist eben bei nicht TSL extrem einfach, dann kann ich mich mit diesem verschlüsseltn Passwort an deinem Server anmelden, indem ich ihm dieses schicke. Mich interessiert dabei gar nicht was das entschlüsselt bedeutet...

    Und das du das nicht erkennst lässt mich stark daran zweifeln das du dich laut deiner eigenen Aussage damit auskennst....
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)