2015-05-17 5 views
5

Ich baue eine Social-Media-Anwendung, und ich möchte etwas Hilfe bei der Kodierung einer Passwort-Zeichenfolge zu SHA512 in Swift. Ich habe die CryptoSwift-Bibliothek auf GitHub gefunden, aber es fällt mir schwer, sie in mein Swift-Projekt zu laden und sie mit meinen Projektdateien zu verknüpfen. Weiß jemand, wie man das relativ leicht erreicht? Vielen Dank im Voraus, KyleWie hasse ich eine Zeichenfolge in Swift an SHA512?

+1

Ich glaube, CryptoSwift ist der einfache Weg :) – gutenmorgenuhu

+2

Welche Probleme haben Sie genau mit CryptoSwift? - Sie benötigen nicht unbedingt ein Framework von Drittanbietern, Sie können auch Apples CommonCrypto mit dünnen Swift-Wrappern verwenden. Beispiele: http://stackoverflow.com/questions/25023376/how-can-i-hash-a-nsstring-to-sha512 (Ihre eigene Frage :), http://stackoverflow.com/questions/6228092/how- can-i-compute-a-sha-2-ideal-sha-256-oder-sha-512-hash-in-ios, http://stackoverflow.com/questions/25761344/how-to-crypt-string- to-sha1-with-swift, http://stackoverflow.com/questions/25388747/sha256-in-swift. –

+0

@MartinR Danke fürs Teilen! Diese Antwort hat wirklich geholfen! Dies ist der Artikel, der meine Frage beantwortet hat (http: // stackoverflow.com/questions/25761344/how-to-crypt-string-zu-sha1-mit-swift). Ich musste nur SHA1 zu SHA512 wechseln. – TechnologyGuy

Antwort

2

Swift 3

func sha512() -> String { 
    let data = self.data(using: .utf8)! 
    var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) 
    data.withUnsafeBytes({ 
     _ = CC_SHA512($0, CC_LONG(data.count), &digest) 
    }) 

    return digest.map({ String(format: "%02hhx", $0) }).joined(separator: "") 
} 

Swift 2,3

func sha512() -> String { 
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)! 
    var digest = [UInt8](count:Int(CC_SHA512_DIGEST_LENGTH), repeatedValue: 0) 
    CC_SHA512(data.bytes, CC_LONG(data.length), &digest) 
    let hexBytes = digest.map { String(format: "%02hhx", $0) } 

    return hexBytes.joinWithSeparator("") 
} 
7

Lösung für Swift 3:

extension String { 

    func sha512() -> String { 
     let data = self.data(using: .utf8)! 
     var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) 
     data.withUnsafeBytes({ 
      _ = CC_SHA512($0, CC_LONG(data.count), &digest) 
     }) 
     return digest.map({ String(format: "%02hhx", $0) }).joined(separator: "") 
    } 

} 
+0

Ich frage mich, wie 'self.data (using: .utf8)' jemals fehlschlagen kann, da 'self' ein gültiger' String' sein muss. – zaph

+0

Ja, Sie haben Recht. Swift-Strings sind immer Unicode-Strings, daher kann 'self.data (using: .utf8)' niemals fehlschlagen. Ich habe meine Antwort entsprechend angepasst. – sundance

+0

Was muss ich auf einem Spielplatz importieren, um Zugriff auf 'CC_'-Funktionen zu erhalten? Stiftung ist nicht genug. – Jeff

1

Sie müssen die C-Bibliothek CommonCrypto importieren. Sie können CommonCrypto nicht einfach in Ihre swift-Datei importieren, da es kein eigenständiges Modul ist.

Wenn Sie eine Bridging-Header-Datei haben, haben Sie Glück! fügen Sie diese einfach auf diese Datei

#import <CommonCrypto/CommonCrypto.h> 

There are some articles about different ways to do that.

Dann können Sie dieses Stück Code verwenden sha512 zur Verfügung für jede Zeichenfolge Ihrer Wahl zu haben:

extension String { 

    public var sha512: String { 
     let data = self.data(using: .utf8) ?? Data() 
     var digest = [UInt8](repeating: 0, count: Int(CC_SHA512_DIGEST_LENGTH)) 
     data.withUnsafeBytes({ 
      _ = CC_SHA512($0, CC_LONG(data.count), &digest) 
     }) 
     return digest.map({ String(format: "%02hhx", $0) }).joined(separator: "") 
    } 
} 
2

Ich finde alle Antwort ok, aber wenn wir eine echte universelle Lösung haben sollten, denke ich, wir müssen es auf ein höheres Level bringen.

CC_LONG ist nur ein UInt32 und wird nicht wirklich große Datenstrukturen unterstützen.

Dies ist meine Lösung in Swift 3:

Zuerst haben wir eine Grundlage schaffen:

struct Sha512 { 
    let context = UnsafeMutablePointer<CC_SHA512_CTX>.allocate(capacity:1) 

    init() { 
     CC_SHA512_Init(context) 
    } 

    func update(data: Data) { 
     data.withUnsafeBytes { (bytes: UnsafePointer<Int8>) -> Void in 
      let end = bytes.advanced(by: data.count) 
      for f in sequence(first: bytes, next: { $0.advanced(by: Int(CC_LONG.max)) }).prefix(while: { (current) -> Bool in current < end}) { 
       _ = CC_SHA512_Update(context, f, CC_LONG(Swift.min(f.distance(to: end), Int(CC_LONG.max)))) 
      } 
     } 
    } 

    func final() -> Data { 
     var digest = [UInt8](repeating: 0, count:Int(CC_SHA512_DIGEST_LENGTH)) 
     CC_SHA512_Final(&digest, context) 

     return Data(bytes: digest) 
    } 
} 

Zur Vereinfachung haben wir eine Erweiterung für Data:

extension Data { 
    func sha512() -> Data { 
     let s = Sha512() 
     s.update(data: self) 
     return s.final() 
    } 
} 

Und schließlich ein Erweiterung für String:

Diese Lösung kann für Sha256, MD5 usw. verwendet werden, um mit dem CommonCrypto von Apple eine gute, universelle Lösung zu erhalten.

Verwandte Themen