2010-05-31 11 views
5

Actualmente estoy tratando de actualizar un proyecto mío de .NET 3.5 a .NET 4.0SHA1CryptoServiceProvider cambió en .NET 4

Todo iba muy bien, todo el código compilado, pasaron todas las pruebas.
Luego llegué a un problema de implementación en mi entorno de ensayo.
De repente, mis inicios de sesión ya no funcionaban.

Parece mis contraseñas hash SHA1 hash están siendo diferente en .NET 4.

estoy usando el SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

Para probar que he creado un nuevo proyecto de Visual Studio con 2 aplicaciones de consola.
El primero dirigido a .NET Framework 3.5 y el segundo a 4.0.
Corrí exactamente el mismo código hash en ambos y se produjeron diferentes resultados.

¿Por qué sucede esto y cómo puedo solucionarlo?
Obviamente no puedo actualizar todas las contraseñas de mis usuarios considerando que no sé cuáles son.

Cualquier ayuda sería muy apreciada.

CÓDIGO DE MUESTRA

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

posible duplicado de [Inicio de sesión falla después de la actualización a ASP.net 4.0 de 3.5] (http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-to-asp-net-4-0-from-3-5) - solución incluida –

+0

lamentablemente este no es el mismo caso. Esto se refiere a FormsAuthenticationCookies y ViewState y es solo un problema "si ejecuta ASP.NET 2.0/ASP.NET 4 mezclado". Pero DANG Pensé que era mi solución – WebDude

+0

¿Puedes aclarar la confusión de AsymetricHash/Hash? Solo para estar seguros. –

Respuesta

2

Uno de los comentarios me llevó a encontrando el error en mi código
Al crear mi matriz de bytes para que sea hash, intenté agregar la cadena con una versión invertida de sí mismo.

E.g. dada la "contraseña" para discutir De hecho, me almohadilla "passworddrowssap"

Sin embargo, mi código tiene un ligero error en ella:

.Reverse() es un método de extensión de LINQ que puede revertir una cadena.
Sin embargo, no devuelve una cadena, devuelve:

IEnumerable<Char> 

Calling .ToString() en este tipo de hecho vuelve:

System.Linq.Enumerable + d__99`1 [Sistema. Char]

Hacer lo mismo en .NET 4.0 devuelve

S ystem.Linq.Enumerable + d__a0`1 [System.Char]

Por lo tanto, mis contraseñas estaban siendo hashed de forma diferente.
Lo que debería haber hecho para crear por matriz de bytes fue:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

suena como que podría ser la codificación de caracteres problema. Asegúrese de que la cadena que se está hash es en la codificación [UTF-8, ANSI, etc.] que esperas (y si lo es, asegurarse de que el ambiente es demasiado antigua.)

-Oisin

+0

He estado usando Encoding.Default. he intentado especificar una codificación y ninguno de los siguientes trabajado: Encoding.ASCII, Encoding.BigEndianUnicode, Encoding.Unicode, Encoding.UTF32, Encoding.UTF7, Encoding.UTF8 – WebDude

+0

hash trabaja a nivel de flujo de bytes - Soy no estoy seguro si me entiendes Está especificando la codificación ¿dónde? Lo único que importa es que se verifica que ambos sistemas estén alimentando el mismo _bytes_ a la clase sha1. – x0n

+0

por favor vea la muestra de código que es el método que llamo. Ambos sitios se ejecutan exactamente en el mismo servidor, por lo que no estoy seguro de dónde cambiaría la codificación. ¿Cómo puedo verificar que ambos sistemas estén alimentando los mismos bytes a la clase sha1? según mi ejemplo de código anterior, ¿puedo verificar el buffer.Length? – WebDude