Hash-Wert-Berechnung mit .NET SHA-1 in Applikationen nutzen

Autor / Redakteur: Dipl.-Ing. Andreas Maslo / Stephan Augsten

Das .NET-Framework stellt über den Namespace System.Security.Cryptography alle grundlegenden Klassen bereit, um Hash-Werte in eigenen Anwendungen selbst zu berechnen. Wie Sie die Hash-Wertberechnung für den SHA-1-Algorithmus vornehmen, soll an dieser Stelle an einem kleinen Programm exemplarisch gezeigt werden.

Anbieter zum Thema

Viele Anwendungen verwenden Registrierschlüssel, Product-Keys oder Kennworte, um einen legalen Programmzugriff sicherzustellen. Um diese Informationen bei der Eingabe auf Korrektheit gegenprüfen zu können, könnte der verschlüsselte Vergleichswert über das Programm verwaltet werden beziehungsweise abrufbar sein. Andernfalls muss ein Vergleichswert in unleserlicher Form hinterlegt sein, der nicht mit dem ursprünglichen Zugangsschlüssel oder Kennwort in Bezug gesetzt werden kann.

An dieser Stelle kommen die so genannten Hash-Werte ins Spiel. Dabei handelt es sich um Prüfsummen zu Zeichenketten (Strings), die keinen Rückschluss auf die ursprünglichen Quelldaten zulassen. Dies bedeutet, dass Hash-Werte sehr einfach in Applikationen hinterlegt werden können, ohne Kennworte und Zugangsschlüssel direkt offen zu legen.

Auch das chiffrierte Pendant ist über das Programm fortan nicht mehr zugänglich, so dass der unerwünschte Programmzugriff erheblich erschwert wird. Auch um Kennworte zu speichern, kann alternativ auf deren Hash-Werte zurückgegriffen werden. Der Wert, der sich für ein und dieselbe Zeichenkette ergibt, ist abhängig von der Routine zur Prüfsummen-Berechnung. Für gleiche Strings ergibt sich in jedem Fall ein eindeutiger Hash-Wert.

1. Entwicklungsumgebung und Programm

Das Beispielprogramm Hashnet wurde mit Visual Basic 2005 entwickelt und befindet sich sowohl im Quell- als auch Binärformat im ZIP-Archiv zu diesem Artikel. Es kann nach dem Entpacken unmittelbar ausgeführt werden, sofern auch das .NET Framework 2.0 Redistributable bereits auf dem jeweiligen Zielrechner installiert ist.

2. Namensraum importieren

Damit Sie die Klassen im Namespace System.Security.Cryptography in einer .NET-Anwendung vereinfacht einsetzen können, importieren Sie zunächst in der jeweiligen Klasse den entsprechenden Namensraum mithilfe der Imports-Anweisung. In der Beispielanwendung finden Sie die Anweisung in der Formularklasse Hashnet.vb.

Imports System.Security.Cryptography

3. Eine allgemeine Funktion für SHA-1-Hash-Werte

Die benutzerdefinierte Funktion „String2Hash“ wandelt vereinfacht eine beliebige Zeichenkette, die über den Value-Parameter übergeben wird, in einen entsprechende Hash-Wert um. Anschließend liefert sie das Ergebnis als Zeichenkette an das aufrufende Programm zurück. Die Umkodierung erfolgt dabei über ein Byte-Datenfeld.

Nach Wahl des Cryptographic Service Providers, hier vom Typ „SHA1CryptoSercviceProvider“ (SHA-1-Algorithmus), erfolgt die Verschlüsselung über dieses Byte-Array sowie die Methode „ComputeHash“. Das Ergebnis wird entsprechend in ein Byte-Array (hier mit dem Namen hByte) abgelegt, das mithilfe der Konvertiermethode ToBase64String in den korrespondierenden Zeichenkettenwert überführt werden kann. Der Hash-Wert selbst wird abschließend im Zeichenkettenformat über den Funktionsnamen an das aufrufende Programm zurückgeliefert.

Public Function String2Hash(ByVal Value As String) As StringDim StrBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(Value)Dim hAlgorithm As New SHA-1CryptoServiceProviderDim hBytes() As Byte = hAlgorithm.ComputeHash(StrBytes)hAlgorithm.Clear()Return Convert.ToBase64String(hBytes)End Function

2. Zeichenketten chiffrieren

Im Programm Hashnet werden Zeichenketten über das Textfeld txtInput eingegeben und nach Anwahl der Schaltfläche Hash-Wert zu Zeichenkette über die Ereignisprozedur btnString_Click mithilfe der Funktion String2Hash in den zugehörigen SHA-1-Hashwert umgerechnet. Das Ergebnis wird unmittelbar in das Bezeichnungsfeld lbHash geschrieben.

Private Sub btnString_Click(ByVal sender As System.Object, ByVal e As _System.EventArgs) Handles btnString.ClicklbHash.Text = „Die Zeichenkette hat folgenden Hash-Wert: „ & _vbCrLf & vbCrLf & String2Hash(txtInput.Text)End Sub

3. Dateien verschlüsseln

Die Routine String2Hash kann entsprechend auch zur Ermittlung von Hash-Werten für einzelne Dateien herangezogen werden. Dazu muss die jeweilige Datei allerdings zuerst in eine Zeichenkette eingelesen werden. Im Beispielprogramm übernimmt diese Aufgabe die Ereignisprozedur btnFile_Click, die nach Anwahl der Schaltfläche Hash-Wert zu einer Datei ausgeführt wird.

Nachdem Sie eine Datei über den Datei öffnen-Dialog OpenDlg ausgewählt und mit OK bestätigt haben, wird die Datei mit FileOpen im Binärmodus geöffnet. Nach Ermittlung der Dateilänge über die LOF-Funktion wird dann eine leere Zeichenkette str aufbereitet, in die der gesamte Dateiinhalt aufnehmbar ist.

Das Füllen der Zeichenkette erfolgt mit FileGet, ehe die Datei abschließend mit FileClose wieder geschlossen wird. Der binäre Dateiinhalt wird dann über die Zeichenkettenvariable str an die Funktion String2Hash übergeben. Das Funktionsergebnis wird erneut in das Bezeichnungsfeld lbHash geschrieben.

Private Sub btnFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _Handles btnFile.ClickWith OpenDlgIf .ShowDialog = Windows.Forms.DialogResult.OK ThenDim DNr As Integer = FreeFile()FileOpen(DNr, .FileName, OpenMode.Binary, OpenAccess.Read)Dim str As String = Space(LOF(DNr))FileGet(DNr, str)FileClose(DNr)lbHash.Text = „Die Datei ‚“ & .FileName & „‘ hat folgenden Hash-Wert: „ & _vbCrLf & vbCrLf & String2Hash(str)End IfEnd WithEnd Sub

4. Hashnet im Praxiseinsatz

Das Programm Hashnet kann wahlweise den Hash-Wert zu einer im Hauptdialog eingegebenen Zeichenkette oder aber zu einer beliebigen Datei ermitteln. Die Dateiauswahl erfolgt über einen herkömmlichen Datei öffnen-Dialog.

Der jeweils zuletzt errechnete Hatch-Wert wird im unteren Rahmenfeld des Hauptdialoges mit einem kurzen Hinweis dazu, zu welchem Objekt die Hash-Wertberechnung erfolgt ist. Mit Beenden können Sie die Beispielanwendung nach bestätigter Sicherheitsabfrage wieder beenden.

Artikelfiles und Artikellinks

(ID:2003240)