usar password online example encrypt ejemplo desencriptar como algoritmo c# string hash sha256

c# - password - Hashing una cadena con Sha256



sha256 online (4)

En la versión de PHP puede enviar ''verdadero'' en el último parámetro, pero el predeterminado es ''falso''. El siguiente algoritmo es equivalente a la función hash predeterminada de PHP al pasar ''sha256'' como el primer parámetro:

public static string GetSha256FromString(string strData) { var message = Encoding.ASCII.GetBytes(strData); SHA256Managed hashString = new SHA256Managed(); string hex = ""; var hashValue = hashString.ComputeHash(message); foreach (byte x in hashValue) { hex += String.Format("{0:x2}", x); } return hex; }

Intento hash una cadena usando SHA256, estoy usando el siguiente código:

using System; using System.Security.Cryptography; using System.Text; public class Hash { public static string getHashSha256(string text) { byte[] bytes = Encoding.Unicode.GetBytes(text); SHA256Managed hashstring = new SHA256Managed(); byte[] hash = hashstring.ComputeHash(bytes); string hashString = string.Empty; foreach (byte x in hash) { hashString += String.Format("{0:x2}", x); } return hashString; } }

Sin embargo, este código da resultados significativamente diferentes en comparación con mis amigos php, así como generadores en línea (como este generador )

¿Alguien sabe cuál es el error? Diferentes bases?


Puede usar un pimiento para cortar su contraseña:

private const string _pepper = "P&0myWHq"; private static string CalculateHashedPassword(string clearpwd) { using (var sha = SHA256.Create()) { var computedHash = sha.ComputeHash(Encoding.Unicode.GetBytes(clearpwd+_pepper)); return Convert.ToBase64String(computedHash); } }

O puede usar un salt (= valor generado aleatoriamente almacenado con su contraseña hash en la base de datos)


También tuve este problema con otro estilo de implementación, pero olvidé dónde lo obtuve desde que fue hace 2 años.

static string sha256(string randomString) { var crypt = new SHA256Managed(); string hash = String.Empty; byte[] crypto = crypt.ComputeHash(Encoding.ASCII.GetBytes(randomString)); foreach (byte theByte in crypto) { hash += theByte.ToString("x2"); } return hash; }

Cuando ingreso algo como abcdefghi2013 por alguna razón, da resultados diferentes y produce errores en mi módulo de inicio de sesión. Luego intenté modificar el código de la misma manera que lo sugerido por Quuxplusone y cambié la codificación de ASCII a UTF8 , ¡y finalmente funcionó!

static string sha256(string randomString) { var crypt = new System.Security.Cryptography.SHA256Managed(); var hash = new System.Text.StringBuilder(); byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(randomString)); foreach (byte theByte in crypto) { hash.Append(theByte.ToString("x2")); } return hash.ToString(); }

Gracias de nuevo Quuxplusone por la maravillosa y detallada respuesta! :)


Encoding.Unicode es el nombre engañoso de Microsoft para UTF-16 (una codificación de doble ancho, utilizada en el mundo de Windows por razones históricas pero no utilizada por nadie más). http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx

Si inspecciona su matriz de bytes , verá que cada segundo byte es 0x00 (debido a la codificación de doble ancho).

Debería utilizar Encoding.UTF8.GetBytes lugar.

Pero también, verá diferentes resultados dependiendo de si considera o no que el byte ''/0'' terminación forma parte de los datos que está procesando. Hashing los dos bytes "Hi" dará un resultado diferente de hash los tres bytes "Hi" . Tendrás que decidir qué quieres hacer. (Probablemente quieras hacer el código PHP de tu amigo).

Para texto ASCII, Encoding.UTF8 definitivamente será adecuado. Si busca la compatibilidad perfecta con el código de su amigo, incluso en entradas que no sean ASCII, será mejor que intente algunos casos de prueba con caracteres que no sean ASCII, como é y y vea si sus resultados aún coinciden. Si no, tendrás que averiguar qué codificación está usando realmente tu amigo; podría ser una de las "páginas de códigos" de 8 bits que solía ser popular antes de la invención de Unicode. (Una vez más, creo que Windows es la razón principal por la que todavía hay que preocuparse por las "páginas de códigos").