public static bool Testar(string informacao, string valorHash, AlgoritimoHash algoritmoHash = AlgoritimoHash.SHA256) { var hashComSaltoBytes = Convert.FromBase64String(valorHash); int tamanhoHashEmBits; switch (algoritmoHash) { case AlgoritimoHash.SHA1: tamanhoHashEmBits = 160; break; case AlgoritimoHash.SHA384: tamanhoHashEmBits = 384; break; case AlgoritimoHash.SHA512: tamanhoHashEmBits = 512; break; default: tamanhoHashEmBits = 256; break; } var tamanhoHashEmBytes = tamanhoHashEmBits / 8; if (hashComSaltoBytes.Length < tamanhoHashEmBytes) { return(false); } var saltoBytes = new byte[hashComSaltoBytes.Length - tamanhoHashEmBytes]; for (var i = 0; i < saltoBytes.Length; i++) { saltoBytes[i] = hashComSaltoBytes[tamanhoHashEmBytes + i]; } var resultadoHashTexto = Calcular(informacao, saltoBytes, algoritmoHash); return(valorHash == resultadoHashTexto); }
public static string Calcular(string informacao, byte[] saltoBytes = null, AlgoritimoHash algoritmoHash = AlgoritimoHash.SHA256) { if (saltoBytes == null) { const int tamanhoMinimoDoSalto = 8; const int tamanhoMaximoDoSalto = 12; var aleatorio = new Random(); var tamanhoDoSalto = aleatorio.Next(tamanhoMinimoDoSalto, tamanhoMaximoDoSalto); saltoBytes = new byte[tamanhoDoSalto]; var rng = new RNGCryptoServiceProvider(); rng.GetNonZeroBytes(saltoBytes); } string valorHash; var informacaoBytes = Encoding.ASCII.GetBytes(informacao); var informacaoComSaltoBytes = new byte[informacaoBytes.Length + saltoBytes.Length]; for (var i = 0; i < informacaoBytes.Length; i++) { informacaoComSaltoBytes[i] = informacaoBytes[i]; } for (var i = 0; i < saltoBytes.Length; i++) { informacaoComSaltoBytes[informacaoBytes.Length + i] = saltoBytes[i]; } HashAlgorithm hash; switch (algoritmoHash) { case AlgoritimoHash.SHA1: hash = new SHA1Managed(); break; case AlgoritimoHash.SHA384: hash = new SHA384Managed(); break; case AlgoritimoHash.SHA512: hash = new SHA512Managed(); break; default: hash = new SHA256Managed(); break; } try { var hashBytes = hash.ComputeHash(informacaoComSaltoBytes); var hashComSaltoBytes = new byte[hashBytes.Length + saltoBytes.Length]; for (var i = 0; i < hashBytes.Length; i++) { hashComSaltoBytes[i] = hashBytes[i]; } for (var i = 0; i < saltoBytes.Length; i++) { hashComSaltoBytes[hashBytes.Length + i] = saltoBytes[i]; } valorHash = Convert.ToBase64String(hashComSaltoBytes); } finally { hash.Clear(); } return(valorHash); }