Swift, CryptoKit und Hashwerte

Auf der WWDC 2019 hat Apple eine neue Kryptografie-API vorgestellt: CryptoKit. Als Programmierer muss man sich also nicht mehr mit Low-Level-APIs auseinandersetzen. Im Rahmen dieses Artikels werfen wir einen Blick auf die von CryptoKit unterstützten Hash-Funktionen:

  • SHA512 (512-Bit SHA-2-Algorithmus)
  • SHA384 (384-Bit SHA-2-Algorithmus)
  • SHA256 (256-Bit SHA-2-Algorithmus)

Darüber hinaus ist ein sogenanntes Insecure Module implementiert, dass die als veraltet geltenden Funktionen

  • MD5 und
  • SHA-1

bereitstellt. Diese Hash-Funktionen sollte nicht mehr verwendet werden.

Zunächst sei angemerkt, dass auf Eurem Mac Xcode 11 und die macOS-Version 10.15 (Catalina) installiert sein muss, um nachfolgende Beispiele in einem Playground ausprobieren zu können.

Hash-Funktionen dienen dazu, die Integrität einer Datei zu gewährleisten. Als Beispiel soll der Hashwert einer Textdatei (“Text.txt”) gebildet werden. Diese Textdatei, die lediglich den Text “Hello, World!” zum Inhalt hat, habe ich zu einem Playground hinzugefügt.

text file in a Xcode Playground file
Eine zum Playground hinzugefügte Textdatei.

Mithilfe der SHA256-Methode wird der Hashwert dieser Datei folgendermaßen ermittelt:

import Foundation
import CryptoKit

let filePath = Bundle.main.path(forResource: "Text", ofType: "txt")!
let textFile = FileManager.default.contents(atPath: filePath)!

let fileDigest = SHA256.hash(data: textFile)
print(fileDigest.description)

Dies führt zur Ausgabe von:

SHA256 digest: c98c24b677eff44860afea6f493bbaec5bb1c4cbb209c6fc2bbb47f66ff2ad31

Solange die Textdatei nicht verändert wird, bleibt dieser Hashwert gleich, was bedeutet, dass die Integrität der Datei gewährleistet ist.

Es sei angemerkt, dass es bei einer Applikation im produktiven Einsatz nicht ratsam ist, den Hashwert über die description-Eigenschaft abzufragen. Denn es ist nicht ausgeschlossen, dass Apple dies in der Zukunft ändern mag. Die Eigenschaft description sollte daher nur für das Debugging verwendet werden.