2009-07-06 31 views
5

He estado buscando una manera de hash una cadena dada en C# que utiliza una clave predeterminada.Hash MD5 dado una clave en C#

En mis aventuras a través de Internet tratando de encontrar un ejemplo, he visto muchos ejemplos de MD5CryptoServiceProvider que parecen usar una clave predeterminada para la máquina, pero ninguno de ellos aplica una clave específica. Necesito tener una clave específica para codificar datos y sincronizarla con el servidor de otra persona. Les entrego una cadena hash y un número de identificación y usan eso para analizar los datos y devolverme un conjunto similar. Entonces, de todos modos hay que obtener md5 para hash a través de una clave específica que sea consistente con ambos.

Preferiría que esto se haga en C#, pero si no es posible con las bibliotecas, ¿puede hacerlo con algunos lenguajes web como php o asp?

Editar: Entiende mal la situación en la que me lanzaron y después de un rato sentado y pensando en por qué me tendrían que usar una llave, parece que quieren una clave añadida al final de la cadena y hash. De esta forma, el servidor puede agregar la clave que tiene junto con los datos pasados ​​para garantizar que sea una computadora con acceso válido. De todos modos ... gracias a todos^_^

Edit2: Como dice mi comentario a continuación, era el término 'salazón' que era ajeno. Oh las alegrías de ser arrojado a algo nuevo sin direcciones.

+1

No hay clave para MD5 ... como Tom Ritter señaló, es ** ** no un algoritmo de cifrado –

+0

Como todo el mundo ha señalado MD5 es hashing, no cifrado, pero no es claro a partir de su entrada si en realidad * do * quiere hashing y misspoke o realmente quiere cifrado. Aclarar por favor – annakata

+0

Su edición realmente no clarificó su pregunta. MD5 no usa ninguna "clave predeterminada" sobre la que está preguntando. Sin embargo, si todo lo que necesita hacer es comparar hashes, simplemente tome el hash de sus dos entradas y compare los resultados bit a bit. Tenga en cuenta que MD5 por lo general (salvo el muy poco probable caso de colisión hash) da resultados completamente diferentes, incluso si las entradas varían en la cantidad más pequeña. – Naaff

Respuesta

17

MD5 no es cifrado, es un hash. No permite descifrar una cadena.

Está buscando un algoritmo de cifrado simétrico. Utiliza la misma clave para cifrar y descifrar. Intenta usar las funciones de cifrado without understanding them is dangerous. Incluso si crees que los entiendes, puedes cometer un error.

Si está transfiriendo datos al servidor de otra persona, puede ser mejor usar algo así como gpg para cifrar el archivo utilizando una clave simétrica que ambos estén de acuerdo por teléfono, o tal vez algunos de criptografía de clave pública. De esta forma, no escribe ningún código criptográfico, y es más seguro (no completamente seguro, pero más seguro).


Editar: Todavía estoy tratando de descifrar sus necesidades.

MD5 es una función hash no rayada: no hay ninguna tecla en uso. Entonces, digamos que el servidor te envía una cadena gigante, o un archivo, y un hash. A continuación, MD5 la cadena o archivo, y compare el hash que calculó con el hash que enviaron. Si coinciden, los datos fueron no corruptos en tránsito. Que no es significa que nadie manipuló lo que le enviaron en tránsito, porque MD5 no tiene una "salsa secreta" para él. Puedo hacer md5 cualquier cosa que quiera y enviársela.

A HMAC es una función hash con clave. Tiene un ingrediente secreto que solo tú y el grupo con el que te estás comunicando deben saber: la clave secreta. Si le envían una cadena o un archivo largos, y un HMAC, puede calcular el HMAC usted mismo, comparar su HMAC y el de ellos, y si coinciden, , los datos no se dañaron en tránsito, ni los datos se alteraron con.

+0

+1 por mencionar HMAC. – ojrac

2

MD5 es una función hash y, estrictamente hablando, no se usa para "encriptar" una cadena. Produce un "Message Digest" de 128 bits (de ahí el MD en el nombre) que se utiliza como un tipo de huella dactilar para la cadena de entrada.

0

Usted puede utilizar AES de C# para hacer el tipo de cifrado que busca. Aquí está an article sobre cómo.

0

Se debe utilizar una de las clases heredadas de SymmetricAlgorithm, por ejemplo:

  • AesCryptoServiceProvider
  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • TripleDESCryptoServiceProvider
0

Así que, ¿por qué la siguiente prueba ¿falla si ambas cadenas de entrada son idénticas?

[TestMethod] 
    public void MD5HashTest() 
    { 
     var hash1 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 
     var hash2 = (new MD5CryptoServiceProvider()).ComputeHash(new System.Text.ASCIIEncoding().GetBytes("now is the time for all good men.")); 

     Assert.AreEqual(hash1, hash2); 
    } 
+0

Esto se debe a que Assert.AreEqual está verificando la igualdad de referencia: hash1 y hash2 son objetos diferentes, por lo tanto, su prueba falla. Sin embargo, si observas los contenidos de hash1 y hash2, verás que contienen exactamente el mismo conjunto de bytes. –