2010-03-12 26 views
8

Sono un principiante della crittografia che cerca di passare alcuni valori avanti e indietro tra i sistemi. Posso crittografare il valore, ma non riesco a capire come decodificare dall'altra parte. Ho creato una semplice applicazione Windows Form utilizzando VB.NET. Cercando di inserire un valore e una chiave, crittografare e quindi decrittografare per ottenere il valore originale. Ecco il mio codice finora. Qualsiasi aiuto molto apprezzato. Grazie.Come decodificare una stringa crittografata con HMACSHA1?

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 

risposta

16

HMAC-SHA1 è unidirezionale hash, non un bidirezionale encryption algoritmo. Non puoi decrittografarlo. Non ho il tempo di fornire il codice di crittografia completo qui - è un argomento complicato, ma lo "Beginning ASP.NET Security" di Barry Dorrans ti darebbe un buon punto di partenza. (Solo alcuni di essi sono specifici di ASP.NET). Puoi anche guardare il suo DDD talk sull'argomento.

+0

Grazie per l'informazione, Jon. –

+2

Sha-1 è un hash unidirezionale. HMAC-SHA1 è un codice di autenticazione del messaggio. Quelle chiaramente non sono la stessa cosa. Sarebbe davvero d'aiuto essere un po 'più preciso. – Accipitridae

+0

* è un argomento complicato * - Per la cronaca, c'è codice e pseudo-codice per l'implementazione hmac_hash [su wikipedia] (http://en.wikipedia.org/wiki/Hash-based_message_authentication_code). – automaton

21

Solo per ampliare la risposta di Jon, perché probabilmente ti stai chiedendo quale sia il motivo della crittografia di qualcosa che non puoi decifrare - HMAC-SHA1 è, come ha detto Jon, un hash. La stringa prodotta non contiene le informazioni originali, anche in forma crittografata ... È solo una sequenza di byte.

La bellezza dell'hash tuttavia è che qualsiasi tipo di modifica che potresti apportare nella stringa causerà quasi certamente una modifica nel risultato dell'hash e il risultato dell'hash tende ad essere piuttosto piccolo. Per questo motivo, gli hash vengono spesso utilizzati per garantire che un'informazione non sia stata manomessa.

Per esempio,

Voglio inviare Jon qui un messaggio - e voglio che lui sia convinto che uno dei suoi compagni, non ha cambiato il messaggio prima della sua lettura. Non posso semplicemente prendere l'hash del mio messaggio e inviarlo, perché tutto ciò che un causatore dovrebbe fare è sostituire il messaggio con uno di loro e fornire un hash appropriato ...

Tuttavia, se Fornisco il mio messaggio con un hash non del messaggio stesso, ma piuttosto del messaggio con alcuni byte extra specifici che John ed io abbiamo concordato in anticipo, il produttore del problema è sconfitto. Jon sa aggiungere i byte extra (comunemente noto come salatura dell'hash) prima che il mio messaggio venga cancellato, ma la causa del problema non lo fa, quindi se cambia il messaggio, anche se risolve il suo hash, Jon può vedere che qualcosa è sbagliato ...

Encyryption/hash sono un business poco pratici, e ho appena scalfito la superficie di me stesso - ma ho pensato che questo potrebbe dare un semplice esempio di ciò che gli hash sono utilizzati per la ...

Un altro uso molto comune è per mantenere le informazioni sull'appartenenza al sito: le persone non memorizzano la password, ma piuttosto l'hash della password. Ciò significa che anche se qualcuno riesce a scalzare i tuoi dati utente, non sono in grado di usarli per accedere al tuo sistema.

Martin

+0

Grazie, Martin. Alcune informazioni utili –

+0

Nessun problema compagno ... –

2

Un semplice hash unidirezionale spiegazione sul motivo per cui la gente avrebbe voglia di farlo.

Diciamo che si dispone di un account utente con lo username John e la password Doe. Si memorizza l'hash della seguente stringa.

Nome, il tuo numero preferito, e la loro password selezionata

ad esempio: hash = myHash ("john7 @ password")

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

Ora che hash è sicuro e non posso essere invertito di nuovo a capire qual è il tuo numero preferito nella maggior parte dei casi. Per verificare se l'hash è quello giusto per l'accesso, devi re-hash l'input fornito (nome, il tuo numero o w/e, password) e se ottieni lo stesso hash esatto, è un accordo valido. non è completamente semplice!

- dovrei usare la stessa chiave per ri-cancellare i miei dati?

Problemi correlati