Tengo un problema al intentar introducir una cadena hash c#
.
Ya probé algunos sitios web, pero la mayoría de ellos usa archivos para obtener el hash. Otros que son para cadenas son un poco demasiado complejos. Encontré ejemplos de autenticación de Windows para la web como este:
FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")
Necesito usar un hash para hacer más segura una cadena que contiene un nombre de archivo. ¿Cómo puedo hacer eso?
Ejemplo:
string file = "username";
string hash = ??????(username);
¿Debería usar otro algoritmo hash y no "md5"?
b.ToString("X2")
?La forma más rápida de obtener una cadena hash para almacenar contraseñas es mediante el siguiente código:
internal static string GetStringSha256Hash(string text) { if (String.IsNullOrEmpty(text)) return String.Empty; using (var sha = new System.Security.Cryptography.SHA256Managed()) { byte[] textData = System.Text.Encoding.UTF8.GetBytes(text); byte[] hash = sha.ComputeHash(textData); return BitConverter.ToString(hash).Replace("-", String.Empty); } }
Observaciones:
sha
variable debe refactorizarse en un campo de clase;fuente
SHA1Managed
la clase no es muy costosa. consume unos 130 bytes y los inicializa a algún valor estático, pero eso es todo. por lo que no debería haber un problema de rendimiento en la mayoría de los casos.SHA1Managed
esIDisposable
y, por lo tanto, requiere envolver su uso en unusing
bloque.Dispose
método de propósito es borrar el búfer interno. Si no lo hace, correrá el riesgo de sufrir un ataque de memoria.SHA1Managed
que no es costoso, quiero decir que su creación no lo es. Además, un algoritmo hash no es necesariamente costoso. Solo tiene que ser (extremadamente) costoso cuando desea encontrar una colisión.Realmente no entiendo el alcance completo de su pregunta, pero si todo lo que necesita es un hash de la cadena, entonces es muy fácil obtenerlo.
Simplemente use el método GetHashCode.
Me gusta esto:
string hash = username.GetHashCode();
fuente
GetHashCode
no es un algoritmo hash criptográficamente seguro. Use SHA256 como mínimo o incluso mejor use BCrypt o Scrypt para un algoritmo seguro.Creo que lo que estás buscando no es hash sino cifrado. Con el hash, no podrá recuperar el nombre de archivo original de la variable "hash". Con el cifrado puede hacerlo y es seguro.
Consulte AES en ASP.NET con VB.NET para obtener más información sobre el cifrado en .NET.
fuente
//Secure & Encrypte Data public static string HashSHA1(string value) { var sha1 = SHA1.Create(); var inputBytes = Encoding.ASCII.GetBytes(value); var hash = sha1.ComputeHash(inputBytes); var sb = new StringBuilder(); for (var i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString(); }
fuente
Si el rendimiento no es una preocupación importante, también puede utilizar cualquiera de estos métodos:
(En caso de que desee que la cadena hash esté en mayúsculas, reemplácela
"x2"
por"X2"
).public static string SHA256ToString(string s) { using (var alg = SHA256.Create()) return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2"))); }
o:
public static string SHA256ToString(string s) { using (var alg = SHA256.Create()) return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString(); }
fuente
El camino más corto y rápido de todos los tiempos. ¡Solo 1 línea!
public static string StringSha256Hash(string text) => string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
fuente