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?
Antwort
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("")
}
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: "")
}
}
Ich frage mich, wie 'self.data (using: .utf8)' jemals fehlschlagen kann, da 'self' ein gültiger' String' sein muss. – zaph
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
Was muss ich auf einem Spielplatz importieren, um Zugriff auf 'CC_'-Funktionen zu erhalten? Stiftung ist nicht genug. – Jeff
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: "")
}
}
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.
- 1. Wie hasse ich eine Zeichenkette, ohne ein abschließendes '\ n' hinzuzufügen?
- 2. Hash eine Passwort-Zeichenfolge mit SHA512 wie C#
- 3. Wie kann ich einen SHA512-Hash in C# reproduzieren, der zum PHP SHA512 passt?
- 4. Wie passe ich eine ganze Zeichenfolge an eine Regex an?
- 5. Wie drucken SHA512 Hash in C
- 6. Was ist die Länge einer Hash-Zeichenfolge mit SHA512?
- 7. Wie kann ich eine Zeichenfolge in C schneiden?
- 8. Warum wählte SHA512 über SHA384?
- 9. Wie übergebe ich eine Zeichenfolge an einen Parameter has_many: finder_sql?
- 10. Wie konvertiert man eine JSON-Zeichenfolge in eine normale Zeichenfolge in Swift?
- 11. Wie füge ich eine Zeichenfolge in eine andere Zeichenfolge ein?
- 12. Wie gebe ich die Zeitzone für eine DateFormat-Zeichenfolge an?
- 13. Wie lösche ich eine Zeichenfolge?
- 14. Wie eine Zeichenfolge an eine Funktion in Objective-C
- 15. Wie kann ich eine formatierte Zeichenfolge an eine vorhandene Zeichenfolge anhängen?
- 16. Symfony2: Wie erstelle ich sha512 Hash eines Passwortes?
- 17. Problem beim Zurückgeben einer Zeichenfolge an vorherigen Ansichtscontroller in Swift
- 18. Jquery + Klick + Bild Swaps + IE6 = Ich hasse diesen Browser
- 19. Datenbindung an eine verschlüsselte Zeichenfolge?
- 20. Swift Spielplatz - Wie man eine Zeichenfolge mit Komma in eine Zeichenfolge mit Dezimalzahlen konvertieren
- 21. Konvertieren Sie eine einfache Zeichenfolge in JSON String in Swift
- 22. Wie konvertiere ich eine Zeichenfolge wie "Red" in eine System.Windows.Media.Color?
- 23. Swift, wie man Zeichenfolge in NSDate konvertiert
- 24. Wie hängen Sie an eine bereits vorhandene Zeichenfolge an?
- 25. Verify eine Zeichenfolge als eine gültige UUID in Swift
- 26. Wie erstelle ich eine CGSize in Swift?
- 27. Wie animiere ich eine NSLayoutConstraint in Swift?
- 28. Wie kann ich eine Zeichenfolge an der Konsole an bestimmten Koordinaten in C++ drucken?
- 29. Wie normalisiere ich eine Zeichenfolge?
- 30. Wie kann ich mit einer Zeichenfolge durch eine Zeichenfolge "sprechen"
Ich glaube, CryptoSwift ist der einfache Weg :) – gutenmorgenuhu
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. –
@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