9 Stimmen

Wie entschlüsselt man eine mit HMACSHA1 verschlüsselte Zeichenfolge?

Ich bin ein Anfänger in Sachen Verschlüsselung und versuche, einige Werte zwischen verschiedenen Systemen hin und her zu übertragen. Ich kann den Wert verschlüsseln, aber ich weiß nicht, wie ich ihn auf der anderen Seite entschlüsseln kann. Ich habe eine einfache Windows Forms-Anwendung mit VB.NET erstellt. Ich versuche, einen Wert und einen Schlüssel einzugeben, zu verschlüsseln und dann zu entschlüsseln, um den ursprünglichen Wert zu erhalten. Hier ist mein Code so weit. Jede Hilfe wird sehr geschätzt. Danke!

Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1

    Private Sub btnEncode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncode.Click
        Dim hmacsha1 As New HMACSHA1(Encoding.ASCII.GetBytes(txtKey.Text))
        Dim hashValue As Byte() = hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(txtValue.Text))
        txtResult.Text = BytesToHexString(hashValue)
        hmacsha1.Clear()
    End Sub

    Private Sub btnDecode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecode.Click
        '???
    End Sub

    Private Function BytesToHexString(ByVal bytes As Byte()) As String
        Dim output As String = String.Empty
        Dim i As Integer = 0
        Do While i < bytes.Length
            output += bytes(i).ToString("X2")
            i += 1
        Loop
        Return output
    End Function
End Class

21voto

Martin Milan Punkte 6270

Nur um Jons Antwort zu ergänzen, weil Sie sich wahrscheinlich fragen, was es bringt, etwas zu verschlüsseln, das man nicht entschlüsseln kann - HMAC-SHA1 ist, wie Jon sagte, ein Hash. Die erzeugte Zeichenfolge enthält nicht die ursprünglichen Informationen, auch nicht in verschlüsselter Form... Es ist nur eine Folge von Bytes.

Das Schöne am Hash ist jedoch, dass jede Art von Änderung, die Sie an der Zeichenkette vornehmen, mit ziemlicher Sicherheit zu einer Änderung des Hash-Ergebnisses führt, und das Hash-Ergebnis ist in der Regel recht klein. Aus diesem Grund werden Hashes häufig verwendet, um sicherzustellen, dass eine Information nicht verfälscht wurde.

Zum Beispiel,

Ich möchte Jon hier eine Nachricht schicken - und ich möchte, dass er sicher ist, dass einer seiner Kollegen die Nachricht nicht geändert hat, bevor er sie gelesen hat. Ich kann nicht einfach den Hash meiner Nachricht nehmen und ihn weiterschicken, denn ein Unruhestifter müsste nur die Nachricht durch eine eigene ersetzen und einen entsprechenden Hash angeben...

Wenn ich jedoch meine Nachricht mit einem Hash-Wert versehe, der nicht aus der Nachricht selbst besteht, sondern aus der Nachricht mit einigen spezifischen zusätzlichen Bytes, die John und ich im Voraus vereinbart haben, ist der Störenfried besiegt. Jon weiß, dass er die zusätzlichen Bytes hinzufügen muss, bevor er den Hashwert meiner Nachricht berechnet, aber der Störenfried weiß das nicht - wenn er also die Nachricht ändert, obwohl er seinen eigenen Hashwert berechnet hat, kann Jon sehen, dass etwas nicht stimmt...

Verschlüsselung / Hashes sind eine knifflige Angelegenheit, und ich habe selbst kaum an der Oberfläche gekratzt - aber ich dachte, dies könnte Ihnen ein einfaches Beispiel dafür geben, wofür Hashes verwendet werden...

Eine weitere sehr häufige Verwendung ist die Verwaltung von Informationen über die Mitgliedschaft auf einer Website - die Leute speichern nicht das Passwort, sondern den Hash des Passworts. Das heißt, selbst wenn es jemandem gelingt, Ihre Benutzerdaten zu klauen, kann er sich damit nicht bei Ihrem System anmelden.

Martin

19voto

Jon Skeet Punkte 1325502

HMAC-SHA1 ist ein einseitiges Hash nicht eine bidirektionale Verschlüsselung Algorithmus. Sie können ihn nicht entschlüsseln. Ich habe nicht die Zeit, hier den vollständigen Verschlüsselungscode anzugeben - es ist ein kompliziertes Thema, aber Barry Dorrans' "Einführung in die ASP.NET-Sicherheit" wäre ein guter Ausgangspunkt. (Nur einiges davon ist ASP.NET-spezifisch.) Sie können sich auch seine DDD-Gespräch zu diesem Thema.

2voto

sean Punkte 21

Eine einfache einseitige Hash-Erklärung, warum die Leute das tun wollen.

Nehmen wir an, Sie haben ein Benutzerkonto mit dem Benutzernamen John und dem Passwort Doe. Sie speichern den Hash der folgenden Zeichenfolge.

Vorname, Ihre Lieblingsnummer und das von Ihnen gewählte Passwort

zum Beispiel: hash= myHash("john7@password")

             now hash = "qk239qa*@$)(*84509053903" or whatever

Dieser Hash ist nun sicher und kann in den meisten Fällen nicht mehr rückgängig gemacht werden, um herauszufinden, was Ihre Lieblingsnummer ist. Um zu prüfen, ob der Hash der richtige für die Anmeldung ist, muss man die eingegebenen Daten (Name, Nummer oder Passwort) noch einmal hacken, und wenn man genau den gleichen Hash erhält, ist das Geschäft gültig.

--Sollte ich denselben Schlüssel verwenden, um meine Daten erneut zu hacken?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X