public static string ComputeHash(string plaintext, Supported_HA hash, byte[] salt) { int minSaltLength = 4; int maxSaltLenght = 6; byte[] SaltBytes = null; if(salt!=null) { SaltBytes = salt; } else { Random r = new Random(); int SaltLenght = r.Next(minSaltLength, maxSaltLenght); SaltBytes = new byte[SaltLenght]; RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetNonZeroBytes(SaltBytes); rng.Dispose(); } byte[] plaintData = ASCIIEncoding.UTF8.GetBytes(plaintext); byte[] plainDataAndSalt = new byte[plaintData.Length + SaltBytes.Length]; for(int x=0; x<plaintData.Length;x++) { plainDataAndSalt[x] = plaintData[x]; } for (int n = 0; n < SaltBytes.Length; n++) plainDataAndSalt[plaintData.Length + n] = SaltBytes[n]; byte[] hashValue = null; switch(hash) { case Supported_HA.SHA256: SHA256Managed sha= new SHA256Managed(); hashValue= sha.ComputeHash(plainDataAndSalt); sha.Dispose(); break; case Supported_HA.SHA384: SHA384Managed sha1 = new SHA384Managed(); hashValue = sha1.ComputeHash(plainDataAndSalt); sha1.Dispose(); break; case Supported_HA.SHA512: SHA512Managed sha2 = new SHA512Managed(); hashValue = sha2.ComputeHash(plainDataAndSalt); sha2.Dispose(); break; } byte[] resuflt = new byte[hashValue.Length + SaltBytes.Length]; for (int x = 0; x < hashValue.Length; x++) resuflt[x] = hashValue[x]; for (int n = 0; n < SaltBytes.Length; n++) resuflt[hashValue.Length + n] = SaltBytes[n]; return Convert.ToBase64String(resuflt); }