2010-03-12 19 views
8

Soy un principiante de encriptación que intenta pasar algunos valores entre sistemas. Puedo encriptar el valor, pero parece que no puedo descifrar cómo descifrarlo en el otro extremo. Creé una aplicación simple de Windows Forms usando VB.NET. Intentando ingresar un valor y una clave, encripta y luego descifra para obtener el valor original. Aquí está mi código hasta ahora. Cualquier ayuda muy apreciada. Gracias.¿Cómo descifrar una cadena cifrada 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 

Respuesta

16

HMAC-SHA1 es una sola vía hash, no un algoritmo bidireccional encryption. No puedes descifrarlo. No tengo tiempo para proporcionar el código de cifrado completo aquí; es un tema complicado, pero el "Beginning ASP.NET Security" de Barry Dorrans le daría un buen punto de partida. (Solo parte de esto es específico de ASP.NET). También podría ver su DDD talk sobre el tema.

+0

Gracias por la información, Jon. –

+2

Sha-1 es un hash de un solo sentido. HMAC-SHA1 es un código de autenticación de mensaje. Esos claramente no son lo mismo. Realmente ayudaría a ser un poco más preciso. – Accipitridae

+0

* es un tema complicado * - Para el registro, hay código y pseudocódigo para la implementación de hmac_hash [en wikipedia] (http://en.wikipedia.org/wiki/Hash-based_message_authentication_code). – automaton

21

Solo para ampliar la respuesta de Jon, porque probablemente se esté preguntando cuál es el punto de encriptar algo que no puede descifrar: HMAC-SHA1 es, como dijo Jon, un hash. La secuencia producida no contiene la información original, incluso en forma cifrada ... Es solo una secuencia de bytes.

Sin embargo, la belleza del hash es que cualquier tipo de cambio que pueda hacer en la cadena casi seguramente dará como resultado un cambio en el resultado del hash, y el resultado del hash tiende a ser bastante pequeño. Por esta razón, los hash se usan a menudo para garantizar que una información no se haya manipulado.

Por ejemplo,

Quiero enviar un mensaje a Jon aquí - y yo quiero que él esté seguro de que uno de sus compañeros no ha cambiado el mensaje antes de su lectura. No puedo simplemente tomar el hash de mi mensaje y enviarlo, porque todo lo que un causante de problemas debería hacer es reemplazar el mensaje por uno propio y proporcionar un hash apropiado ...

Sin embargo, si Ofrezco mi mensaje con un hash no del mensaje en sí, sino más bien del mensaje con algunos bytes adicionales específicos que John y yo hemos acordado de antemano, el creador de problemas es derrotado. Jon sabe agregar los bytes adicionales (conocidos comúnmente como salazón del hash) antes de que elucilo mi mensaje, pero el causante del problema no lo hace, así que si él cambia el mensaje, aunque él resuelva su propio hash, Jon puede ver que algo anda mal ...

Encyryption/hashes son un negocio más incómoda, y apenas he arañado la superficie a mí mismo - pero pensé que esto le podría dar un simple ejemplo de lo que los hash se utilizan para ...

Otro uso muy común es para mantener la información de membresía del sitio: las personas no almacenan la contraseña, sino el hash de la contraseña. Esto significa que incluso si alguien logra apoderarse de sus datos de usuario, no podrá usarlos para iniciar sesión en su sistema.

Martin

+0

Gracias, Martin. Alguna información útil. –

+0

No hay problema, compañero ... –

2

Un simple hash unidireccional explicación de por qué la gente quiere hacerlo.

Supongamos que tiene una cuenta de usuario con el nombre de usuario John y la contraseña Doe. Usted almacena el hash de la siguiente cadena.

primer nombre, su número favorito, y su contraseña seleccionada

por ejemplo: de hash = myHash ("john7 @ contraseña")

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

Ahora que hash es seguro y no puede ser revertido de nuevo a averiguar cuál es tu número favorito en la mayoría de los casos. Para comprobar si el hash es el correcto para iniciar sesión, volver a hash la entrada proporcionada (nombre, su número o w/e, contraseña) y si obtiene el mismo hash exacto, es una oferta válida. ¡no es completamente simple!

--¿Debería usar la misma clave para volver a codificar mis datos?

Cuestiones relacionadas