2010-03-12 10 views
8

Ich bin ein Verschlüsselungsneuling, der versucht, einige Werte zwischen Systemen hin- und herzuübertragen. Ich kann den Wert verschlüsseln, aber ich kann nicht herausfinden, wie ich am anderen Ende entschlüsseln kann. Ich habe eine einfache Windows Forms-Anwendung mit VB.NET erstellt. Versuchen Sie, 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 soweit. Jede Hilfe sehr geschätzt. Vielen Dank.Wie entschlüsselt man eine mit HMACSHA1 verschlüsselte Zeichenkette?

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 

Antwort

16

HMAC-SHA1 ist ein Einweg hash, nicht ein bidirektionaler encryption Algorithmus. Sie können es nicht entschlüsseln. Ich habe keine Zeit, hier einen vollständigen Verschlüsselungscode anzugeben - es ist ein kompliziertes Thema, aber Barry Dorrans '"Beginning ASP.NET Security" würde Ihnen einen guten Ausgangspunkt geben. (Nur ein Teil davon ist ASP.NET-spezifisch.) Sie können auch seine DDD talk zum Thema ansehen.

+0

Danke für die Info, Jon. –

+2

Sha-1 ist ein Einweg-Hash. HMAC-SHA1 ist ein Nachrichtenauthentifizierungscode. Das sind eindeutig nicht die gleichen Dinge. Es würde wirklich helfen, ein wenig genauer zu sein. – Accipitridae

+0

* es ist ein kompliziertes Thema * - Für die Aufzeichnung gibt es Code und Pseudo-Code für hmac_hash Implementierung [Wikipedia] (http://en.wikipedia.org/wiki/Hash-based_message_authentication_code). – automaton

21

Nur um Jons Antwort zu erweitern, weil Sie sich wahrscheinlich fragen, was es heißt, etwas zu verschlüsseln, das Sie nicht entschlüsseln können - HMAC-SHA1 ist, wie Jon sagte, ein Hash. Die erzeugte Zeichenfolge enthält nicht die ursprüngliche Information, auch nicht in verschlüsselter Form ... Es ist nur eine Sequenz von Bytes.

Die Schönheit des Hashes ist jedoch, dass jede Art von Änderung, die Sie in der Zeichenfolge vornehmen, fast sicher zu einer Änderung des Hash-Ergebnisses führt, und das Hash-Ergebnis ist tendenziell ziemlich klein. Aus diesem Grund werden häufig Hashs verwendet, um sicherzustellen, dass eine Information nicht manipuliert wurde.

Zum Beispiel

Ich möchte hier eine Nachricht Jon schicken - und ich will, dass er sicher sein, dass einer seiner Kollegen die Nachricht nicht vor sich geändert hat, um seine zu lesen. Ich kann nicht einfach den Hash meiner Nachricht nehmen und dass entlang senden, weil eine ganze Mühe causer würde tun müssen, ist die Nachricht mit einem ihrer eigenen zu ersetzen, und einem geeigneten Hash ...

Wenn jedoch Ich gebe meine Nachricht mit einem Hash nicht der Nachricht selbst, sondern eher der Nachricht mit einigen spezifischen zusätzlichen Bytes, die John und ich im Voraus vereinbart haben, der Unruhestifter ist besiegt. Jon weiß, dass er die zusätzlichen Bytes hinzufügen muss (allgemein bekannt als das Salzen des Hash), bevor er meine Nachricht hasht, aber der Problemverursacher nicht - wenn er also die Nachricht ändert, obwohl er seinen eigenen Hash ausarbeitet, kann Jon das sehen nicht stimmt ...

Encyryption/Hashes ein knifflig Geschäft ist, und ich habe die Oberfläche selbst kaum zerkratzt - aber ich dachte, das Ihnen ein einfaches Beispiel dafür, was Hashes für verwendet werden, geben könnte ...

Eine weitere häufige Verwendung ist die Pflege von Informationen zur Site-Mitgliedschaft - die Leute speichern nicht das Passwort, sondern den Hash des Passworts. Dies bedeutet, dass selbst wenn es jemandem gelingt, Ihre Benutzerdaten zu erhalten, sie nicht in der Lage sind, sich in Ihr System einzuloggen.

Martin

+0

Danke, Martin. Einige hilfreiche Informationen. –

+0

Kein Problem Kumpel ... –

2

Eine einfache Einweg-Hash-explaination, warum Menschen es tun wollen würde.

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

Vorname, Ihre Lieblingszahl und ihr gewähltes Passwort

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

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

Nun, da Hash sicher ist und kann nicht wieder umgekehrt wird Finde heraus, was deine Lieblingsnummer in den meisten Fällen ist. Um zu überprüfen, ob der Hash der richtige für die Anmeldung ist, würden Sie die angegebene Eingabe erneut hashen (Name, Ihre Nummer oder w/e, Passwort) und wenn Sie den gleichen Hash erhalten, ist dies ein gültiger Deal. wo ist es nicht ganz einfach!

- Soll ich den gleichen Schlüssel verwenden, um meine Daten erneut zu hashen?