SecurityHelper

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace ConsoleApplication1
{

    public class SecurityHelper
    {
        static readonly String WhiteList = "";

        /// <summary>
        /// 判断是否白名单
        /// </summary>
        /// <returns></returns>
        public static Boolean JudgeWhiteList(string str)
        {
            Boolean Result = false;
            var strHost = str;
            if (!String.IsNullOrWhiteSpace(WhiteList))
            {
                if (WhiteList.IndexOf(",") > -1)
                {
                    var IpList = WhiteList.Split(',').ToList();
                    if (IpList.Contains(strHost))
                        Result = true;
                }
                else
                {
                    if (WhiteList.Trim() == strHost.Trim())
                        Result = true;
                }
            }

            return Result;
        }

        /// <summary>
        /// 基于Sha1的自定义加密字符串方法:输入一个字符串,返回一个由40个字符组成的十六进制的哈希散列(字符串)。
        /// </summary>
        /// <param name="str">要加密的字符串</param>
        /// <returns>加密后的十六进制的哈希散列(字符串)</returns>
        public static string LowerSha1(string str)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            byte[] data = SHA1.Create().ComputeHash(bytes);
            StringBuilder builder = new StringBuilder();
            foreach (byte t in data)
            {
                builder.Append(t.ToString("X2"));
            }
            return builder.ToString().ToLower();
        }
        /// <summary>
        /// 基于Sha1的自定义加密字符串方法:输入一个字符串,返回一个由40个字符组成的十六进制的哈希散列(字符串)。
        /// </summary>
        /// <param name="str">要加密的字符串</param>
        /// <returns>加密后的十六进制的哈希散列(字符串)</returns>
        public static string UpperSha1(string str)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            byte[] data = SHA1.Create().ComputeHash(bytes);
            StringBuilder builder = new StringBuilder();
            foreach (byte t in data)
            {
                builder.Append(t.ToString("X2"));
            }
            return builder.ToString().ToUpper();
        }

        /// <summary>
        /// dd 推送业务 header签名验证!
        /// </summary>
        /// <param name="value"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string HashHmac(string value, string key)
        {
            var enc = Encoding.UTF8;
            HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(key));
            hmac.Initialize();
            byte[] buffer = enc.GetBytes(value);
            string localhostSign = Convert.ToBase64String((byte[])hmac.ComputeHash(buffer));
            return localhostSign;
        }

        public string EncryptSHA1(string Source_String)
        {
            byte[] StrRes = Encoding.Default.GetBytes(Source_String);
            HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
            StrRes = iSHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();
            foreach (byte iByte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", iByte);
            }
            return EnText.ToString();
        }



        /// <summary>
        /// sha-2 256加密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string EncryptSHA256(string str)
        {
            System.Security.Cryptography.SHA256 s256 = new System.Security.Cryptography.SHA256Managed();
            byte[] byte1;
            byte1 = s256.ComputeHash(Encoding.Default.GetBytes(str));
            s256.Clear();
            return Convert.ToBase64String(byte1);
        }

        /// <summary>
        /// sha-2 384加密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string EncryptSHA384(string str)
        {
            System.Security.Cryptography.SHA384 s384 = new System.Security.Cryptography.SHA384Managed();
            byte[] byte1;
            byte1 = s384.ComputeHash(Encoding.Default.GetBytes(str));
            s384.Clear();
            return Convert.ToBase64String(byte1);
        }

        /// <summary>
        /// sha-2 512加密
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string EncryptSHA512(string str)
        {
            System.Security.Cryptography.SHA512 s512 = new System.Security.Cryptography.SHA512Managed();
            byte[] byte1;
            byte1 = s512.ComputeHash(Encoding.Default.GetBytes(str));
            s512.Clear();
            return Convert.ToBase64String(byte1);
        }
        private byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };

        /// <summary>
        /// DES加密算法
        /// </summary>
        /// <param name="encryptString"></param>
        /// <param name="encryptKey"></param>
        /// <returns></returns>
        public string EncryptDES(string encryptString, string encryptKey)
        {
            try
            {
                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Convert.ToBase64String(mStream.ToArray());
            }
            catch
            {
                return encryptString;
            }
        }

        /// <summary>
        /// DES解密算法
        /// </summary>
        /// <param name="decryptString"></param>
        /// <param name="decryptKey"></param>
        /// <returns></returns>
        public string DecryptDES(string decryptString, string decryptKey)
        {
            try
            {
                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
        }

        /// <summary>
        /// 原生app解密算法
        /// </summary>
        /// <param name="decryptString"></param>
        /// <param name="decryptKey"></param>
        /// <param name="decryptIV"></param>
        /// <returns></returns>
        public string DecryptDES(string decryptString, string decryptKey, string decryptIV)
        {
            try
            {

                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, Encoding.UTF8.GetBytes(decryptIV)), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
        }


        /// <summary>
        /// 16位MD5加密方法,以前的DVBBS所使用
        /// </summary>
        /// <param name="strSource">待加密字串</param>
        /// <returns>加密后的字串</returns>
        public static string EncryptMD5(string strSource)
        {
            return EncryptMD5(strSource, 16);
        }

        /// <summary>
        /// MD5加密,和动网上的16/32位MD5加密结果相同
        /// </summary>
        /// <param name="strSource">待加密字串</param>
        /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
        /// <returns>加密后的字串</returns>
        public static string EncryptMD5(string strSource, int length)
        {
            byte[] bytes = Encoding.ASCII.GetBytes(strSource);
            byte[] hashValue =
                ((HashAlgorithm)
                 CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
            var sb = new StringBuilder();
            switch (length)
            {
                case 16:
                    for (int i = 4; i < 12; i++)
                        sb.Append(hashValue[i].ToString("x2"));
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return sb.ToString();
        }

        /// <summary>
        /// UTF-8的MD5加密方法
        /// </summary>
        /// <param name="strSource"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        public static string EncryptMD5UTF8(string strSource, int length = 32)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(strSource);
            byte[] hashValue =
                ((HashAlgorithm)
                 CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
            var sb = new StringBuilder();
            switch (length)
            {
                case 16:
                    for (int i = 4; i < 12; i++)
                        sb.Append(hashValue[i].ToString("x2"));
                    break;
                case 32:
                    for (int i = 0; i < 16; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
                default:
                    for (int i = 0; i < hashValue.Length; i++)
                    {
                        sb.Append(hashValue[i].ToString("x2"));
                    }
                    break;
            }
            return sb.ToString();
        }

        #region 3DES加密

        /// <summary>
        /// 加密字符串
        /// </summary>
        /// <param name="encryptStr"></param>
        /// <returns></returns>
        public static string Encrypt3DES(string encryptStr ,Encoding encoding, string privateKey)
        {
            if (string.IsNullOrEmpty(encryptStr)) return string.Empty;
            

            using (SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider())
            {
                algorithm.Key = encoding.GetBytes(privateKey);

                algorithm.Mode = CipherMode.ECB;
                algorithm.Padding = PaddingMode.PKCS7;

                var transform = algorithm.CreateEncryptor();

                var bytes = encoding.GetBytes(encryptStr);
                using (var memoryStream = new MemoryStream())
                {
                    using (var cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(bytes, 0, bytes.Length);
                        cryptoStream.FlushFinalBlock();

                        return Convert.ToBase64String(memoryStream.ToArray());
                    }
                }
            }
        }

        /// <summary>
        /// 解密字符串
        /// </summary>
        /// <param name="decryptStr"></param>
        /// <returns></returns>
        public static string Decrypt3DES(string decryptStr, Encoding encoding, string privateKey)
        {
            if (string.IsNullOrEmpty(decryptStr)) return string.Empty;
            using (SymmetricAlgorithm algorithm = new TripleDESCryptoServiceProvider())
            {
                algorithm.Key = encoding.GetBytes(privateKey);

                algorithm.Mode = CipherMode.ECB;
                algorithm.Padding = PaddingMode.PKCS7;

                using (var transform = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV))
                {
                    var bytes = Convert.FromBase64String(decryptStr);
                    using (var memoryStream = new MemoryStream(bytes))
                    {
                        using (var cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Read))
                        {
                            using (var reader = new StreamReader(cryptoStream, encoding))
                            {
                                return reader.ReadToEnd();
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 签名,连接biz_content, charset, merchant_code, method, timestamp, version,$private_key, 然后进行SHA256加密,不可逆转
        /// </summary>
        /// <param name="str">string str:被加密的字符串</param>
        /// <returns>返回加密后的字符串</returns>
        public static string Sign(string str,string privateKey)
        {
            using (var sha = new SHA256Managed())
            {
                var byteHash = sha.ComputeHash(Encoding.UTF8.GetBytes(str + privateKey));

                return BitConverter.ToString(byteHash).Replace("-", "").ToLower();
            }
        }

        #endregion

        #region FTP字段加密

        /// <summary>
        /// FTP(身份证,手机号)加密
        /// </summary>
        /// <param name="inputstring">加密字段</param>
        /// <param name="inputkey">秘钥</param>
        /// <returns></returns>
        public static long FtpEncypt(int inputstring, int inputkey)
        {
            return inputstring ^ inputkey;
        }

        #endregion

    }
}

posted @ 2019-03-14 11:14  小螃蟹夹子  阅读(418)  评论(0编辑  收藏  举报