Example #1
0
        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);
        }
Example #2
0
        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);
        }