Pregunta

Soy un novato cifrado tratando de pasar algunos valores de ida y vuelta entre los sistemas. Puedo cifrar el valor, pero parece que no puede encontrar la manera de descifrar en el otro extremo. He creado una sencilla aplicación de Windows Forms usando VB.NET. Tratando de introducir un valor y una clave, cifrar y descifrar a continuación para obtener el valor original. Aquí está mi código hasta ahora. Cualquier ayuda muy apreciada. Gracias.

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
¿Fue útil?

Solución

HMAC-SHA1 es una sola vía de hash , no un bidireccional cifrado algoritmo. No se puede descifrarlo. No tengo tiempo para proporcionar el código cifrado completo aquí - es un tema complicado, pero Barry Dorrans' "a partir de la seguridad de ASP.NET" le daría un buen punto de partida. (Sólo algunos de ellos es en ASP.NET específica.) También podría ver a su DDD hablar sobre el tema.

Otros consejos

Sólo para ampliar la respuesta de Jon, porque te estás preguntando cuál es el punto de cifrar algo que no se puede descifrar - HMAC-SHA1 es, como se dijo Jon, un hash. La cadena producida no contiene la información original, incluso en forma encriptada ... Es sólo una secuencia de bytes.

La belleza del hash sin embargo, es que cualquier tipo de cambio que podría hacer en la cadena es casi seguro que resultará en un cambio en el resultado de control, y el resultado de control tiende a ser bastante pequeña. Por esta razón, hashs se utilizan a menudo para asegurarse de que una pieza de información no ha sido 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 tomar el hash de mi mensaje y enviar ese largo, porque todo el causante problemas tendría que hacer es reemplazar el mensaje con uno de los suyos, y proporcionar un hash adecuada ...

Sin embargo, si yo proporciono mi mensaje con un hash no del mensaje en sí, sino más bien del mensaje con unos pocos bytes adicionales específicos que Juan y yo hemos acordado con antelación, es derrotado el creador de problemas. Jon sabe que añadir los bytes adicionales (comúnmente conocidos como la salazón del hash) antes de que los hashes mi mensaje, pero el causante problemas no lo hace - por lo que si se cambia el mensaje, a pesar de que trabaja a cabo su propia hachís, Jon puede ver que algo anda mal ...

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

Otro uso muy común es la de mantener la información de miembro del sitio - la gente no almacenan la contraseña, sino más bien el hash de la contraseña. Esto significa que incluso si alguien logra nick sus datos de usuario, no son capaces de utilizarlo para acceder a su sistema.

Martin

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

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

En 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 lo que su número favorito es en la mayoría de los casos. Para comprobar si el hash es el más adecuado para iniciar la sesión, que le re-hash de la entrada suministrada (nombre, su número o w / e, contraseña) y si se obtiene el mismo hash exacta, es un acuerdo válido. wo0t ¿no es cierto totalmente sencilla!

- debería utilizar la misma clave para re-hash de los datos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top