2017-03-07 2 views
0

Wie konnte ich Hash-Passwort mit sha256 per Post Anfrage senden?Änderbares Datenpaket in JSON

func sha256(string: String) -> Data? { 
     guard let messageData = string.data(using:String.Encoding.utf8) else { return nil; } 
     var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH)) 

     _ = digestData.withUnsafeMutableBytes {digestBytes in 
      messageData.withUnsafeBytes {messageBytes in 
       CC_SHA256(messageBytes, CC_LONG(messageData.count), digestBytes) 
      } 
     } 
     return digestData 
    } 

So hasse ich ein Passwort.

Dann, wenn ich versuche, es als [String: Any] in ein Array zu packen wirft es eine Ausnahme in JSONSErialization'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Foundation._SwiftNSData)'

guard let loginURL = URL(string: LOGIN_URL) else { 
      print("Error: cannot create URL") 
      return 
     } 

     var loginURLRequest = URLRequest(url: loginURL) 
     loginURLRequest.httpMethod = "POST" 

     let content: [String: Any] = ["username": username, "passwordHash": password] 
     let json: Data 

     do { 
      json = try JSONSerialization.data(withJSONObject: content, options: []) 
      loginURLRequest.httpBody = json 
     } catch { 
      print("Error: Can not create JSON") 
      return 
     } 

Vielen Dank im Voraus!

+0

Wie wieder zusammen? Wie folgt: 'let tmp = password.base64EncodedString()'? – yerpy

Antwort

1

Was Sie wahrscheinlich tun möchten, ist der Hash als Hexadezimal-Zeichenfolge codieren. Angesichts Ihrer sha256 Funktion oben definiert ist, wird die folgende tun:

let password = sha256(string: "myPassword") 
    .map { return String(format: "%02x", $0) } 
    .joined() 

let content = [ 
    "username": username, 
    "passwordHash": password 
] 

Alternativ könnten Sie Ihre sha256 Funktion ändern, um eine Zeichenfolge zurück (und es eine Verlängerung der Schnur machen):

func sha256() -> String? { 
    guard let messageData = data(using:String.Encoding.utf8) else { 
     return nil 
    } 

    var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH)) 

    _ = digestData.withUnsafeMutableBytes { digestBytes in 
     withUnsafeBytes { messageBytes in 
      CC_SHA256(messageBytes, CC_LONG(messageData.count), digestBytes) 
     } 
    } 

    return digestData.map { return String(format: "%02x", $0) }.joined() 
} 

Hinweis: Ich winge dies ein wenig seit CommonCrypto wird nicht auf einem Spielplatz arbeiten und ich bin zu faul, um ein ganzes Projekt um diese zu wickeln, aber die wichtigen Teile sind hier.

  1. Verwenden data.map über jedes Byte in der Hash-
  2. wandeln es in einem Hex-String iterieren mit String(format: "%02x"...)
  3. alles mit joined() ich es umwandeln konnte
+0

Danke! Jetzt bekomme ich es :) Können Sie noch erklären, wie genau das funktioniert: '% 02x'? – yerpy

+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html –