MD5, SHA256, SHA512哈希算

简介:

StringHasher.cs

    /// <summary>
    /// 实现各种字符串hash散列算法的类
    /// </summary>
    public class StringHasher
    {
        /// <summary>
        /// 委托表示hash方法实现明确的散列算法
        /// </summary>
        /// <param name="stringToHash">待哈希的字符串</param>
        /// <returns>hash散列后的字符串</returns>
        private delegate string HashAlgorithMethod(string stringToHash);

        /// <summary>
        /// 使用MD5算法哈希字符串
        /// </summary>
        /// <param name="stringToHash">待哈希的字符串.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string MD5ComputeHash(string stringToHash)
        {
            string results;
            using (var md5Algorithm = MD5.Create())
            {
                results = ComputeHash(md5Algorithm, stringToHash);
                DisposeAlgorithm(md5Algorithm);
            }

            return results;
        }

        /// <summary>
        /// 将随机生成的SALT添加到字符串,然后使用MD5算法对字符串进行散列。
        /// salt的长度与算法生成的长度相同
        /// </summary>
        /// <param name="stringToHash">待哈希的字符串.</param>
        /// <param name="salt">Salt 用于密码.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string MD5SaltComputeHash(string stringToHash, out string salt)
        {
            salt = GenerateRandomSalt(16);
            return MD5ComputeHash(salt + stringToHash);
        }

        /// <summary>
        /// 验证字符串与另一个MD5散列字符串。
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">MD5生成哈希来验证.</param>
        /// <returns>字符串是否匹配哈希的布尔值。</returns>
        public bool MD5VerifyHash(string stringToVerify, string hash)
        {
            var hashedString = MD5ComputeHash(stringToVerify);
            return AreTwoStringsEqual(hash, hashedString);
        }

        /// <summary>
        ///  验证字符串与另一个MD5 SALT散列字符串。
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">MD5 SALT生成的哈希来验证</param>
        /// <param name="salt">Salt 用于密码</param>
        /// <returns>字符串是否与SALT哈希匹配的布尔值</returns>
        public bool MD5SaltVerifyHash(string stringToVerify, string hash, string salt)
        {
            return VerifySaltHash(stringToVerify, hash, salt, MD5ComputeHash);
        }

        /// <summary>
        /// 使用SHA256算法Hash字符串
        /// </summary>
        /// <param name="stringToHash">待哈希的字符串.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string SHA256ComputeHash(string stringToHash)
        {
            string results;
            using (var sha256Algorithm = new SHA256Managed())
            {
                results = ComputeHash(sha256Algorithm, stringToHash);
                DisposeAlgorithm(sha256Algorithm);
            }

            return results;
        }

        /// <summary>
        /// 将随机生成的SALT添加到字符串,然后使用SHA256算法对字符串进行散列
        /// salt的长度与算法生成的长度相同
        /// </summary>
        /// <param name="stringToHash">待哈希的字符串.</param>
        /// <param name="salt">Salt 用于密码.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string SHA256SaltComputeHash(string stringToHash, out string salt)
        {
            salt = GenerateRandomSalt(32);
            return SHA256ComputeHash(salt + stringToHash);
        }

        /// <summary>
       
        /// 验证字符串与另一个SHA256散列字符串。
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">SHA256生成哈希来验证.</param>
        /// <returns>字符串是否匹配哈希的布尔值.</returns>
        public bool SHA256VerifyHash(string stringToVerify, string hash)
        {
            var hashedString = SHA256ComputeHash(stringToVerify);
            return AreTwoStringsEqual(hash, hashedString);
        }

        /// <summary>
        ///验证字符串与另一个SHA256 SALT散列字符串
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">SHA256 SALT生成哈希来验证</param>
        /// <param name="salt">Salt 用于密码.</param>
        /// <returns>字符串是否与SALT哈希匹配的布尔值</returns>
        public bool SHA256SaltVerifyHash(string stringToVerify, string hash, string salt)
        {
            return VerifySaltHash(stringToVerify, hash, salt, SHA256ComputeHash);
        }

        /// <summary>
        /// 使用SHA512算法哈希字符串。
        /// </summary>
        /// <param name="stringToHash">要hash的字符串.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string SHA512ComputeHash(string stringToHash)
        {
            string results;
            using (var sha512Algorithm = new SHA512Managed())
            {
                results = ComputeHash(sha512Algorithm, stringToHash);
                DisposeAlgorithm(sha512Algorithm);
            }

            return results;
        }

        
        /// <summary>
        /// 将随机生成的SALT添加到字符串,然后使用SHA512算法对该字符串进行散列
        /// salt与算法生成的长度相同。
        /// </summary>
        /// <param name="stringToHash">要哈希的字符串.</param>
        /// <param name="salt">Salt用于密码.</param>
        /// <returns>hash散列后的字符串.</returns>
        public string SHA512SaltComputeHash(string stringToHash, out string salt)
        {
            salt = GenerateRandomSalt(64);
            return SHA512ComputeHash(salt + stringToHash);
        }


        /// <returns>布尔值,表示字符串是否与散列匹配。</ returns>
        /// <summary>
        /// 验证字符串对与另一个SHA512散列字符串。
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">SHA512生成的哈希来验证.</param>
        /// <returns>符串是否与散列匹配的布尔值.</returns>
        public bool SHA512VerifyHash(string stringToVerify, string hash)
        {
            var hashedString = SHA512ComputeHash(stringToVerify);
            return AreTwoStringsEqual(hash, hashedString);
        }

        /// <summary>
        /// 将字符串与另一个SHA512 SALT散列字符串进行验证。
        /// </summary>
        /// <param name="stringToVerify">要验证的字符串.</param>
        /// <param name="hash">SHA512 SALT生成的哈希来验证.</param>
        /// <param name="salt">Salt用作密码.</param>
        /// <returns>字符串是否与SALT哈希匹配的布尔值.</returns>
        public bool SHA512SaltVerifyHash(string stringToVerify, string hash, string salt)
        {
            return VerifySaltHash(stringToVerify, hash, salt, SHA512ComputeHash);
        }

        /// <summary>
        /// 使用传递的哈希算法计算字符串的哈希值
        /// </summary>
        /// <param name="hashAlgorithm">用于计算的哈希算法.</param>
        /// <param name="stringToHash">要哈希的字符串.</param>
        /// <returns>hash后的字符串.</returns>
        private static string ComputeHash(HashAlgorithm hashAlgorithm, string stringToHash)
        {
            var results = hashAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(stringToHash));
            return BytesToHexadecimalString(results);
        }



        /// <summary>
        ///使用传递的散列算法验证字符串与另一个SALT散列字符串。
        /// </ summary>
        /// <param name =“stringToVerify”>要验证的字符串。</ param>
        /// <param name =“hash”>生成的SALT哈希来验证。</ param>
        /// <param name =“salt”>盐用于密码。</ param>
        /// <param name =“algorithmToInvoke”>用于验证的哈希算法。</ param>
        /// <returns>字符串是否与SALT哈希匹配的布尔值</ returns>
        private static bool VerifySaltHash(string stringToVerify, string hash, string salt, HashAlgorithMethod algorithmToInvoke)
        {
            var hashedString = algorithmToInvoke(salt + stringToVerify);
            return AreTwoStringsEqual(hash, hashedString);
        }

        /// <summary>
        /// 处理哈希算法
        /// </summary>
        /// <param name="hashAlgorithm">释放的hash算法.</param>
        private static void DisposeAlgorithm(HashAlgorithm hashAlgorithm)
        {
            hashAlgorithm.Clear();
        }

        /// <summary>
        /// 生成指定长度的随机SALT
        /// </summary>
        /// <param name="saltLength">产生SALT的长度</param>
        /// <returns>随机生成的SALT.</returns>
        private static string GenerateRandomSalt(int saltLength)
        {
            var random = new RNGCryptoServiceProvider();
            var salt = new byte[saltLength];
            random.GetBytes(salt);
            return BytesToHexadecimalString(salt);
        }

        /// <summary>
        ///将给定的字节数组转换为相应的十六进制字符串。
        /// </ summary>
        /// <param name =“bytesToConvert”>要转换的bytes数组。</ param>
        /// <returns>相应的字符串表示。</ returns>
        private static string BytesToHexadecimalString(byte[] bytesToConvert)
        {
            var hexaDecimalString = new StringBuilder();

            for (var i = 0; i < bytesToConvert.Length; i++)
            {
                hexaDecimalString.Append(bytesToConvert[i].ToString("x2"));
            }

            return hexaDecimalString.ToString();
        }

        /// <summary>
        ///比较两个哈希值,忽略他们的大小写。
        /// </ summary>
        /// <param name =“hash”>要比较的第一个哈希。</ param>
        /// <param name =“hashedString”>要比较的第二个哈希。</ param>
        /// <returns>表示哈希是否相等的布尔值。</ returns>
        private static bool AreTwoStringsEqual(string hash, string hashedString)
        {
            return hash.Equals(hashedString, StringComparison.OrdinalIgnoreCase);
        }
    }

Program.cs代码:

class Program
    {
        static void Main(string[] args)
        {
            const string stringToHash = "helloWorld";
            string salt;
            var hasher = new StringHasher();

            var md5Hash = hasher.MD5ComputeHash(stringToHash);
            Console.WriteLine("md5Hash字符串:"+md5Hash);
            Console.WriteLine("md5Hash长度:" + md5Hash.Length);
            Console.WriteLine("MD5VerifyHash验签:" + hasher.MD5VerifyHash(stringToHash, md5Hash));

            Console.WriteLine("---------------------------------------------------");
            md5Hash = hasher.MD5SaltComputeHash(stringToHash, out salt);
            Console.WriteLine("md5Hash字符串:" + md5Hash);
            Console.WriteLine("md5Hash长度:" + md5Hash.Length);
            Console.WriteLine("MD5SaltVerifyHash验签:" + hasher.MD5SaltVerifyHash(stringToHash, md5Hash, salt));
            Console.WriteLine("---------------------------------------------------");
            var sha256Hash = hasher.SHA256ComputeHash(stringToHash);
            Console.WriteLine("sha256Hash字符串:" + sha256Hash);
            Console.WriteLine("sha256Hash长度:" + sha256Hash.Length);
            Console.WriteLine("SHA256VerifyHash验签:" + hasher.SHA256VerifyHash(stringToHash, sha256Hash));

            Console.WriteLine("---------------------------------------------------");
            sha256Hash = hasher.SHA256SaltComputeHash(stringToHash, out salt);
            Console.WriteLine("sha256Hash字符串:" + sha256Hash);
            Console.WriteLine("sha256Hash长度:" + sha256Hash.Length);
            Console.WriteLine("SHA256SaltVerifyHash验签:" + hasher.SHA256SaltVerifyHash(stringToHash, sha256Hash, salt));
            Console.WriteLine("---------------------------------------------------");

            var sha512Hash = hasher.SHA512ComputeHash(stringToHash);
            Console.WriteLine("sha512Hash字符串:" + sha512Hash);
            Console.WriteLine("sha512Hash长度:" + sha512Hash.Length);
            Console.WriteLine("SHA512VerifyHash验签:" + hasher.SHA512VerifyHash(stringToHash, sha512Hash));

            Console.WriteLine("---------------------------------------------------");
            sha512Hash = hasher.SHA512SaltComputeHash(stringToHash, out salt);
            Console.WriteLine("sha512Hash字符串:" + sha512Hash);
            Console.WriteLine("sha512Hash长度:" + sha512Hash.Length);
            Console.WriteLine("SHA512SaltVerifyHash验签:" + hasher.SHA512SaltVerifyHash(stringToHash, sha512Hash, salt));
            Console.ReadKey();
        }
    }

运行结果如图:

这里写图片描述

相关文章
|
6月前
|
数据安全/隐私保护 Python
Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)
Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)
|
6月前
|
C语言
SHA加密算法
SHA加密算法
46 0
|
7月前
|
算法 C# 流计算
MD5、SHA256等Hash算法的实时计算
MD5、SHA256等Hash算法的实时计算
|
算法 安全 Java
[转载]加密解密算法【RSA、AES、DES、MD5】介绍和使用
为了防止我们的数据泄露,我们往往会对数据进行加密,特别是敏感数据,我们要求的安全性更高。下面将介绍几种常用的加密算法使用。这些算法的加密对象都是基于二进制数据,如果要加密字符串就使用统一编码(如:utf8)进行编码后加密。
2405 0
|
安全 算法 C语言
|
存储 算法 安全
MD5、SHA1、CRC32值是干什么的?
Hash,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值。也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 MD5和SHA1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。
290 0
|
算法 Go 数据安全/隐私保护
Go语言实现md4、md5、sha256哈希算法加密
目录 1. 哈希算法特点 2. 常用的哈希算法 3. go实现MD加密 3.1 MD4 3.2 MD5 3. go实现SHA加密 最后
561 0
Go语言实现md4、md5、sha256哈希算法加密
|
PHP Java Perl
|
算法 Linux 数据安全/隐私保护
巧用OpenSSL完成md2、md4、md5、rmd160、sha、sha1等的验证
相信很多奋斗在运维战线的小伙伴们经常会遇到版本升级之类的问题。笔者之前所在的公司每次进行版本发布的时候都会附带MD5校验哈希值,每次升级之前一般都要核对MD5哈希值的,刚刚开始的时候对Linux并不是非常熟悉,每次下载完升级包之后都会在Windows环境下利用Hash工具校验之后才上传到Linux服务器上进行版本升级操作。
1826 0