A C# class to easily create an md5, sha1, sha256, or sha512 hash
I started making a class to make hashing easier in C#. I found someone who had done this already here: http://techlicity.com/blog/dotnet-hash-algorithms
That was a good start. I just needed to:
- Add unit tests
- Remove the duplicate code (condense the class)
- Add a default values, such as a default Encoding and to use sha256 by default.
- Add easier salt handling.
I condensed the code (by more than half the lines by the way) and now have this much easier to read and test class:
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace WcfSimpleTokenExample.Business
{
public class Hash
{
public static Encoding DefaultEncoding = Encoding.UTF8;
public const HashType DefaultHashType = HashType.SHA256;
public enum HashType
{
MD5,
SHA1,
SHA256,
SHA512
}
public static string Get(string text, HashType hashType = DefaultHashType, Encoding encoding = null)
{
switch (hashType)
{
case HashType.MD5:
return Get(text, new MD5CryptoServiceProvider(), encoding);
case HashType.SHA1:
return Get(text, new SHA1Managed(), encoding);
case HashType.SHA256:
return Get(text, new SHA256Managed(), encoding);
case HashType.SHA512:
return Get(text, new SHA512Managed(), encoding);
default:
throw new CryptographicException("Invalid hash alrgorithm.");
}
}
public static string Get(string text, string salt, HashType hashType = DefaultHashType, Encoding encoding = null)
{
return Get(text + salt, hashType, encoding);
}
public static string Get(string text, HashAlgorithm algorithm, Encoding encoding = null)
{
byte[] message = (encoding == null) ? DefaultEncoding.GetBytes(text) : encoding.GetBytes(text);
byte[] hashValue = algorithm.ComputeHash(message);
return hashValue.Aggregate(string.Empty, (current, x) => current + string.Format("{0:x2}", x));
}
public static bool Compare(string original, string hashString, HashType hashType = DefaultHashType, Encoding encoding = null)
{
string originalHash = Get(original, hashType, encoding);
return (originalHash == hashString);
}
public static bool Compare(string original, string salt, string hashString, HashType hashType = DefaultHashType, Encoding encoding = null)
{
return Compare(original + salt, hashString, hashType, encoding);
}
}
}
Here are some unit tests using MSTest.
using System;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WcfSimpleTokenExample.Business;
namespace WcfSimpleTokenExample.Tests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void MD5Test()
{
// Arrange
const string tobehashed = "1";
// Got comparison hash from here: http://www.xorbin.com/tools/md5-hash-calculator
// Also verified with md5sums.exe
const string expectedHash = "c4ca4238a0b923820dcc509a6f75849b";
// Act
string actualHash = Hash.Get(tobehashed, Hash.HashType.MD5);
// Assert
Assert.AreEqual(expectedHash, actualHash);
}
[TestMethod]
public void Sha1Test()
{
// Arrange
const string tobehashed = "1";
// Got comparison hash from here: http://www.xorbin.com/tools/sha1-hash-calculator
// Also verified with sha1sums.exe
const string expectedHash = "356a192b7913b04c54574d18c28d46e6395428ab";
// Act
string actualHash = Hash.Get(tobehashed, Hash.HashType.SHA1);
// Assert
Assert.AreEqual(expectedHash, actualHash);
}
[TestMethod]
public void Sha256Test()
{
// Arrange
const string tobehashed = "1";
// Got comparison hash from here: http://www.xorbin.com/tools/sha256-hash-calculator
// Also verified with sha1sums.exe
const string expectedHash = "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b";
// Act
string actualHash = Hash.Get(tobehashed, Hash.HashType.SHA256);
// Assert
Assert.AreEqual(expectedHash, actualHash);
}
[TestMethod]
public void Sha512Test()
{
// Arrange
const string tobehashed = "1";
// Got comparison hash from here: http://www.miniwebtool.com/sha512-hash-generator/
const string expectedHash = "4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a";
// Act
string actualHash = Hash.Get(tobehashed, Hash.HashType.SHA512);
// Assert
Assert.AreEqual(expectedHash, actualHash);
}
}
}


Everything was OK. Thank You Very Much!!!!!