/**
         * O procedimento é:
         * - recebe senha X
         * - Hasheia X com SHA256, resultando em Y
         * - "Acopla" o nounce (login) no final deste resultado (Y), resultando em Z
         * - gera um Salt aleatório, com 29 caracteres
         * - Utiliza o BCrypt para gerar outra hash, sendo esta resultado do Salt + Z, resultando em W
         * - Como os primeiros 29 caracteres de W são o proprio salt, encripta-se, com o AES, apenas os caracteres que não fazem parte do Salt, resultando Salt + R
         * - aclopa-se, então, uma Pepper aleatória ao final da string, sendo esta, agora, composta por Salt + R + Pepper; resultando em G
         * - Por fim, hasheia-se G com SHA512 e adiciona ao início da string o Salt; resultando em Salt+F
         */
        public static string Encrypt(string password, string username)
        {
            string hashedPassword = SHA_256.GenerateSHA256String(password);
            string nounced        = hashedPassword + username;
            string mySalt         = BCrypt.GenerateSalt();
            string myHash         = BCrypt.HashPassword(nounced, mySalt);
            string result         = mySalt + AES256.AES_Encrypt(myHash.Substring(29, myHash.Length - 29)) + Pepper.Generate();

            result = mySalt + SHA_512.GenerateSHA512String(result);
            return(result);
        }
        /**
         * Repete o mesmo procedimento de encriptação e compara as hashs resultantes com
         * o que está salvo no banco de dados.
         */
        public static bool Uncrypt(string password, string hash, string username)
        {
            string hashedPassword    = SHA_256.GenerateSHA256String(password);
            string nounced           = hashedPassword + username;
            string myHash            = BCrypt.HashPassword(nounced, hash);
            string mySalt            = myHash.Substring(0, 29);
            string result            = mySalt + AES256.AES_Encrypt(myHash.Substring(29, myHash.Length - 29));
            bool   doesPasswordMatch = Pepper.Check(result, hash, mySalt);

            return(doesPasswordMatch);
        }
示例#3
0
        public CryptoFacade()
        {
            string keyContainerName = ConfigurationManager.AppSettings["RSAKeyContainer"];

            _RSACrypto      = RSACryptoProvider.Get_RSA(keyContainerName);
            _AESCrypto      = new Cryptography <RijndaelManaged>();
            _RSAFormatter   = new RSAOAEPKeyExchangeFormatter(_RSACrypto);
            _RSADeformatter = new RSAOAEPKeyExchangeDeformatter(_RSACrypto);

            string hashSalt = ConfigurationManager.AppSettings["Hash_Salt"];

            _SHA256 = new SHA_256();
            _SHA256.SetSalt(hashSalt);
        }
示例#4
0
        public static void Main(string[] args)
        {
            SHA_256 sha256 = new SHA_256();

            Console.WriteLine(sha256.Encrypt("Hello"));
        }