sha256 NSData to String

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

  • sha256 NSData to String

    Hey zusammen,

    ich habe eine Funktion die mir einen Hash erstellt. Nun möchte ich diesen Hash in den NSUserDefaults speichern.

    Der Hash wird so generiert:

    Quellcode

    1. var myHash = "data1" + "data2" + "data3" //später Variablen
    2. func sha256(data : NSData) -> NSData {
    3. var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
    4. CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
    5. let res = NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH))
    6. return res
    7. }
    8. let myHashdata = myHash.dataUsingEncoding(NSUTF8StringEncoding)
    9. let myHashOutput = sha256(myHashdata!)
    Alles anzeigen
    print myHashOutput: <ecc05eb8 deb23904 1bbbe37a 9c45aa01 40f518a0 997bcd69 ad89691d 732cae2d>



    Da ich aber kein NSData in die NSUserDefaults speichern kann möchte ich das NSdata in ein String konvertieren.
    Versucht habe ich es so:

    Quellcode

    1. func sha256(data : NSData) -> NSString {
    2. var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
    3. CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
    4. let res = NSString(data: NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH)), encoding: NSUTF8StringEncoding) ?? ""
    5. return res
    6. }
    Resultat es kommt nicht mehr raus. Nur ein leerer String?

    Hat jemand eine Idee woran es liegt?
  • macmoonshine schrieb:

    Du kannst doch NSData-Objekte in den Userdefaults ablegen. Warum willst du die Daten in einen String umwandeln?

    Ansonsten kannst du auch in Swift einen NSMutableString verwenden, und die Bytes über appendFormat: anhängen.
    Wenn ich das NSData-Objekt in den Userdefaults ablegen will passiert hier irgendwie nix.


    Quellcode

    1. defaults.setObject(myHash, forKey: "myHash")
    ah moment das geht doch hatte in der Ausgabe einen Fehler im Code ^^

    Ok dann kann ich also doch das ganze in den Userdefaults speichern. Das ist gut zu wissen.

    Da ich den Xcode-Hash aber mit dem PHP-Hash vom Webserver abgleichen möchte ist hier ja ein String am einfachsten.

    Kann ich also einen NSString daraus machen oder geht das nicht?
  • Quellcode

    1. + (NSString *)sha1:(NSString *) input
    2. {
    3. NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    4. uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    5. CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
    6. NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    7. for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    8. {
    9. [output appendFormat:@"%02x", digest[i]];
    10. }
    11. return output;
    12. }
    Alles anzeigen
    So siehts für SHA1 in ObjC aus. Ist denke mal ähnlich für Swift und SHA256
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • gritsch schrieb:

    DKCode schrieb:

    Kann ich also einen NSString daraus machen oder geht das nicht?
    kannst du lesen?
    falls ja, lies unsere beiden beiträge nochmal durch...
    Das hab ich aber ich wurde aus deinem Fachchinesisch leider nicht schlau.

    Danke mcmoonshine für den Tipp NSMutableString. Konnte dadurch bei Stackoverflow eine Lösung finden.

    Quellcode

    1. func sha256(string: NSString) -> NSString {
    2. let data = string.dataUsingEncoding(NSUTF8StringEncoding)!
    3. var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
    4. CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
    5. let resstr = NSMutableString()
    6. for byte in hash {
    7. resstr.appendFormat("%02hhx", byte)
    8. }
    9. return resstr
    10. }
  • DKCode schrieb:

    Da ich den Xcode-Hash aber mit dem PHP-Hash vom Webserver abgleichen möchte ist hier ja ein String am einfachsten.
    Einfach vielleicht, aber fehleranfällig. Mit einem String kann bei der Erzeugung auf dem Weg eine Menge passieren (Encoding, Leerzeichen, Groß-/Kleinschreibung usw.), sprich: Es gibt mehrere Strings zu dem gleichen Hash. Kann man ausgiebig kanonisieren, aber ich würde das in NSData konvertieren und die dann vergleichen.
    Multigrad - 360°-Produktfotografie für den Mac
  • mattik schrieb:

    DKCode schrieb:

    Da ich den Xcode-Hash aber mit dem PHP-Hash vom Webserver abgleichen möchte ist hier ja ein String am einfachsten.
    Einfach vielleicht, aber fehleranfällig. Mit einem String kann bei der Erzeugung auf dem Weg eine Menge passieren (Encoding, Leerzeichen, Groß-/Kleinschreibung usw.), sprich: Es gibt mehrere Strings zu dem gleichen Hash. Kann man ausgiebig kanonisieren, aber ich würde das in NSData konvertieren und die dann vergleichen.

    Oh je das klingt ja als wäre ich schon wieder auf dem falschen Weg :S

    Der Vergleich müsste dann aber in der App passieren oder? Jetzt habe ich ja den Weg, dass die App mir
    einen Hash aus Daten + Salt erzeugt und dann den Webserver schickt. Der Webserver erzeugt ebenfalls per PHP ein Hash aus Daten + Salt.
    Beides wird dann Serverseitig per PHP verglichen und anschließend andere Funktionen / Optionen freigeben oder verweigert.

    Wenn ich nun NSData-Objekte vergleiche müsste ich erst den Webserver anfunken um den Hash zu bekommen, anschließend diesen als JSON-Wert
    gelieferten String in ein NSData-Objekt konvertieren, dann die 2 Objekte vergleichen und dann erneut eine Verbindung zum Webserver aufbauen,
    um die anderen Funktionen / Optionen freizugeben oder zu verweigern.

    Meinst du das so?
  • DKCode schrieb:

    Oh je das klingt ja als wäre ich schon wieder auf dem falschen Weg

    Der Vergleich müsste dann aber in der App passieren oder? Jetzt habe ich ja den Weg, dass die App mir
    einen Hash aus Daten + Salt erzeugt und dann den Webserver schickt. Der Webserver erzeugt ebenfalls per PHP ein Hash aus Daten + Salt.
    Beides wird dann Serverseitig per PHP verglichen und anschließend andere Funktionen / Optionen freigeben oder verweigert.

    Wenn ich nun NSData-Objekte vergleiche müsste ich erst den Webserver anfunken um den Hash zu bekommen, anschließend diesen als JSON-Wert
    gelieferten String in ein NSData-Objekt konvertieren, dann die 2 Objekte vergleichen und dann erneut eine Verbindung zum Webserver aufbauen,
    um die anderen Funktionen / Optionen freizugeben oder zu verweigern.

    Meinst du das so?
    Ich weiß nicht wie gut PHP im Umgang mit Binärdaten ist, befürchte aber, dass das nicht wirklich Spaß macht. Naja, Strings sind ja auch nicht gerade eine Stärke von PHP, aber was soll's: Nein, es geht auch mit Strings. Da muss man halt sehr gründlich sanitizen und kanonisieren.
    Multigrad - 360°-Produktfotografie für den Mac