Tenho um problema ao tentar inserir uma string hash c#
.
Já tentei alguns sites, mas a maioria deles está usando arquivos para obter o hash. Outros que são para strings são um pouco complexos. Encontrei exemplos de autenticação do Windows para web como este:
FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")
Preciso usar um hash para tornar uma string que contém um nome de arquivo mais segura. Como eu posso fazer isso?
Exemplo:
string file = "username";
string hash = ??????(username);
Devo usar outro algoritmo de hash e não "md5"?
b.ToString("X2")
significa?A maneira mais rápida de obter uma string hash para fins de armazenamento de senha é um código a seguir:
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); } }
Observações:
sha
variável deve ser refatorada em um campo de classe;fonte
SHA1Managed
aula não é muito cara. ele consome cerca de 130 bytes e os inicializa com algum valor estático, mas isso é tudo. portanto, não deve haver um problema de desempenho na maioria dos casos.SHA1Managed
éIDisposable
e, portanto, precisa envolver seu uso em umusing
bloco.Dispose
método de propósito é limpar o buffer interno. Caso contrário, haverá risco de ataque à memória.SHA1Managed
não é caro, quero dizer que sua criação não é. Além disso, um algoritmo de hash não é necessariamente caro. Só tem que ser (extremamente) caro quando você quer encontrar uma colisão.Eu realmente não entendo todo o escopo da sua pergunta, mas se tudo que você precisa é um hash da string, então é muito fácil entender.
Basta usar o método GetHashCode.
Como isso:
string hash = username.GetHashCode();
fonte
GetHashCode
não é um algoritmo de hash criptograficamente seguro. Use SHA256 no mínimo ou ainda melhor use BCrypt ou Scrypt para um algoritmo seguro.Acho que o que você está procurando não é hash, mas criptografia. Com o hash, você não poderá recuperar o nome do arquivo original da variável "hash". Com criptografia, você pode, e é seguro.
Consulte AES em ASP.NET com VB.NET para obter mais informações sobre criptografia em .NET.
fonte
//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(); }
fonte
Se o desempenho não for uma preocupação importante, você também pode usar qualquer um destes métodos:
(Caso queira que a string hash esteja em maiúsculas, substitua
"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"))); }
ou:
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(); }
fonte
O caminho mais curto e rápido de todos os tempos. Apenas 1 linha!
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);
fonte