>/// <summary> >/// Generates a hash for the given plain text value and returns a >/// base64-encoded result. Before the hash is computed, a random salt >/// is generated and appended to the plain text. This salt is stored at >/// the end of the hash value, so it can be used later for hash >/// verification. >/// </summary> >/// <param name="plainText"> >/// Plaintext value to be hashed. >/// </param> >/// <param name="hashAlgorithm"> >/// Name of the hash algorithm. Allowed values are: "MD5", "SHA1", >/// "SHA256", "SHA384", and "SHA512" (if any other value is specified >/// MD5 hashing algorithm will be used). This value is case-insensitive. >/// </param> >/// <param name="saltBytes"> >/// Salt bytes. This parameter can be null, in which case a random salt >/// value will be generated. >/// </param> >/// <returns> >/// Hash value formatted as a base64-encoded string. >/// </returns> >public static string ComputeHash(string plainText, > string hashAlgorithm, > byte[] saltBytes) >{ > if (plainText == null) > return null; > > // If salt is not specified, generate it on the fly. > if (saltBytes == null) > saltBytes = SaltBytes; > > // Convert plain text into a byte array. > byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); > > // Allocate array, which will hold plain text and salt. > byte[] plainTextWithSaltBytes = > new byte[plainTextBytes.Length + saltBytes.Length]; > > // Copy plain text bytes into resulting array. > for (int i = 0; i < plainTextBytes.Length; i++) > plainTextWithSaltBytes[i] = plainTextBytes[i]; > > // Append salt bytes to the resulting array. > for (int i = 0; i < saltBytes.Length; i++) > plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i]; > > HashAlgorithm hash; > > // Make sure hashing algorithm name is specified. > if (hashAlgorithm == null) > hashAlgorithm = ""; > > // Initialize appropriate hashing algorithm class. > switch (hashAlgorithm.ToUpper()) > { > case "SHA1": > hash = new SHA1Managed(); > break; > > case "SHA256": > hash = new SHA256Managed(); > break; > > case "SHA384": > hash = new SHA384Managed(); > break; > > case "SHA512": > hash = new SHA512Managed(); > break; > default: > // default to MD5 > hash = new MD5CryptoServiceProvider(); > break; > } > > // Compute hash value of our plain text with appended salt. > byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes); > > > return Convert.ToBase64String(hashBytes); >} >>