2017-03-07 1 views
0

ポストリクエストを介してsha256のハッシュパスワードを送信するにはどうすればよいですか?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 
    } 

これは私がパスワードを持っている方法です。私は[String: Any]として配列にそれをパックしようとするたび

は、その後、それは事前に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 
     } 

おかげで例外がスローされます!

+0

と一緒に戻ってそれをすべてを置きますか?このように: 'let tmp = password.base64EncodedString()'? – yerpy

答えて

1

とすれば、おそらくは、16進文字列としてハッシュをエンコードします。また

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

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

は、あなたが文字列を返すために、あなたのsha256機能を変更することができます(と、それを文字列の拡張子作る):あなたのsha256機能は、上で定義を考えると、以下のことを行います

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() 
} 

を注: CommonCryptoはプレイグラウンドでは動作しないので、私はこれを少し眺めています。私はこれを中心にプロジェクト全体をラップするのが面倒ですが、重要な部分はここにあります。 String(format: "%02x"...)

  • と16進文字列に変換し、ハッシュ
  • に各バイトを反復する

    1. 使用data.mapは、私はそれを変換することができどのようjoined()
  • +0

    ありがとう!今私はそれを得る:)あなたはまだ正確にその作品を説明することができます: '%02x'? – yerpy

    +0

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