using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Syc.Basic.Web.WMS.Tools { public static class SecurityUtil { private static readonly byte[] IvBytes = { 0x32, 0xEF, 0x82, 0xAC, 0x63, 0xFA, 0x47, 0xEF }; #region 通用加密算法 /// /// 哈希加密算法 /// /// 所有加密哈希算法实现均必须从中派生的基类 /// 待加密的字符串 /// 字符编码 /// private static string HashEncrypt(HashAlgorithm hashAlgorithm, string input, Encoding encoding) { var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input.ToCharArray())); return BitConverter.ToString(data).Replace("-", ""); } /// /// 验证哈希值 /// /// 所有加密哈希算法实现均必须从中派生的基类 /// 未加密的字符串 /// 经过加密的哈希值 /// 字符编码 /// private static bool VerifyHashValue(HashAlgorithm hashAlgorithm, string unhashedText, string hashedText, Encoding encoding) { return string.Equals(HashEncrypt(hashAlgorithm, unhashedText, encoding), hashedText, StringComparison.OrdinalIgnoreCase); } #endregion 通用加密算法 #region 哈希加密算法 #region MD5 算法 /// /// MD5 加密 /// /// 待加密的字符串 /// 字符编码 /// public static string MD5Encrypt(this string input, Encoding encoding, int bit = 32) { var str = HashEncrypt(MD5.Create(), input, encoding); if (bit == 16) return str.Substring(9, 16); return str; } /// /// MD5对比 /// /// 未加密的字符串 /// 未密的字符串 /// 字符编码 /// public static bool VerifyMD5Value(this string input, string targetString, Encoding encoding, int bit) { return string.Equals(MD5Encrypt(input, encoding, bit).ToLower(), MD5Encrypt(targetString, encoding, bit).ToLower()); } /// /// 获取文件的MD5摘要 /// /// /// public static string AbstractFile(string fileName) { using (FileStream file = new FileStream(fileName, FileMode.Open)) { return AbstractFile(file); } } /// /// 根据stream获取文件摘要 /// /// /// public static string AbstractFile(Stream stream) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(stream); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } #endregion MD5 算法 #region SHA1 算法 /// /// SHA1 加密 /// /// 要加密的字符串 /// 字符编码 /// public static string SHA1Encrypt(string input, Encoding encoding) { return HashEncrypt(SHA1.Create(), input, encoding); } /// /// 验证 SHA1 值 /// /// 未加密的字符串 /// 字符编码 /// public static bool VerifySHA1Value(string input, Encoding encoding) { return VerifyHashValue(SHA1.Create(), input, SHA1Encrypt(input, encoding), encoding); } #endregion SHA1 算法 #region SHA256 算法 /// /// SHA256 加密 /// /// 要加密的字符串 /// 字符编码 /// public static string SHA256Encrypt(string input, Encoding encoding) { return HashEncrypt(SHA256.Create(), input, encoding); } /// /// 验证 SHA256 值 /// /// 未加密的字符串 /// 字符编码 /// public static bool VerifySHA256Value(string input, Encoding encoding) { return VerifyHashValue(SHA256.Create(), input, SHA256Encrypt(input, encoding), encoding); } #endregion SHA256 算法 #region SHA384 算法 /// /// SHA384 加密 /// /// 要加密的字符串 /// 字符编码 /// public static string SHA384Encrypt(string input, Encoding encoding) { return HashEncrypt(SHA384.Create(), input, encoding); } /// /// 验证 SHA384 值 /// /// 未加密的字符串 /// 字符编码 /// public static bool VerifySHA384Value(string input, Encoding encoding) { return VerifyHashValue(SHA256.Create(), input, SHA384Encrypt(input, encoding), encoding); } #endregion SHA384 算法 #region SHA512 算法 /// /// SHA512 加密 /// /// 要加密的字符串 /// 字符编码 /// public static string SHA512Encrypt(string input, Encoding encoding) { return HashEncrypt(SHA512.Create(), input, encoding); } /// /// 验证 SHA512 值 /// /// 未加密的字符串 /// 字符编码 /// public static bool VerifySHA512Value(string input, Encoding encoding) { return VerifyHashValue(SHA512.Create(), input, SHA512Encrypt(input, encoding), encoding); } #endregion SHA512 算法 #region HMAC-MD5 加密 /// /// HMAC-MD5 加密 /// /// 要加密的字符串 /// 密钥 /// 字符编码 /// public static string HMACSMD5Encrypt(string input, string key, Encoding encoding) { return HashEncrypt(new HMACMD5(encoding.GetBytes(key)), input, encoding); } #endregion HMAC-MD5 加密 #region HMAC-SHA1 加密 /// /// HMAC-SHA1 加密 /// /// 要加密的字符串 /// 密钥 /// 字符编码 /// public static string HMACS_HA1Encrypt(string key, string input, Encoding encoding) { return HashEncrypt(new HMACSHA1(encoding.GetBytes(key.ToCharArray())), input, encoding); } #endregion HMAC-SHA1 加密 #region HMAC-SHA256 加密 /// /// HMAC-SHA256 加密 /// /// 要加密的字符串 /// 密钥 /// 字符编码 /// public static string HMAC_SHA256Encrypt(string key, string input, Encoding encoding) { return HashEncrypt(new HMACSHA256(encoding.GetBytes(key)), input, encoding); } #endregion HMAC-SHA256 加密 #region HMAC-SHA384 加密 /// /// HMAC-SHA384 加密 /// /// 要加密的字符串 /// 密钥 /// 字符编码 /// public static string HMACS_HA384Encrypt(string key, string input, Encoding encoding) { return HashEncrypt(new HMACSHA384(encoding.GetBytes(key)), input, encoding); } #endregion HMAC-SHA384 加密 #region HMAC-SHA512 加密 /// /// HMAC-SHA512 加密 /// /// 要加密的字符串 /// 密钥 /// 字符编码 /// public static string HMACS_HA512Encrypt(string key, string input, Encoding encoding) { return HashEncrypt(new HMACSHA512(encoding.GetBytes(key)), input, encoding); } #endregion HMAC-SHA512 加密 #endregion 哈希加密算法 #region 对称加密算法 #region Des 加解密 /// /// DES 加密 /// /// 待加密的字符串 /// 密钥(8位) /// public static string DESEncrypt(string input, string key) { try { var keyBytes = Encoding.UTF8.GetBytes(key); //var ivBytes = Encoding.UTF8.GetBytes(iv); var des = DES.Create(); des.Mode = CipherMode.ECB; //兼容其他语言的 Des 加密算法 des.Padding = PaddingMode.Zeros; //自动补 0 using (var ms = new MemoryStream()) { var data = Encoding.UTF8.GetBytes(input); using (var cs = new CryptoStream(ms, des.CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode.Write) ) { cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); } return Convert.ToBase64String(ms.ToArray()); } } catch { return input; } } /// /// DES 解密 /// /// 待解密的字符串 /// 密钥(8位) /// public static string DESDecrypt(string input, string key) { try { var keyBytes = Encoding.UTF8.GetBytes(key); //var ivBytes = Encoding.UTF8.GetBytes(iv); var des = DES.Create(); des.Mode = CipherMode.ECB; //兼容其他语言的Des加密算法 des.Padding = PaddingMode.Zeros; //自动补0 using (var ms = new MemoryStream()) { var data = Convert.FromBase64String(input); using (var cs = new CryptoStream(ms, des.CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode.Write) ) { cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); } return Encoding.UTF8.GetString(ms.ToArray()); } } catch { return input; } } #endregion Des 加解密 #endregion 对称加密算法 #region 非对称加密算法 /// /// 生成 RSA 公钥和私钥 /// /// 公钥 /// 私钥 public static void GenerateRSAKeys(out string publicKey, out string privateKey) { using (var rsa = new RSACryptoServiceProvider()) { publicKey = rsa.ToXmlString(false); privateKey = rsa.ToXmlString(true); } } /// /// RSA 加密 /// /// 公钥 /// 待加密的内容 /// 经过加密的字符串 public static string RSAEncrypt(string publickey, string content) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(publickey); var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes); } /// /// RSA 解密 /// /// 私钥 /// 待解密的内容 /// 解密后的字符串 public static string RSADecrypt(string privatekey, string content) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(privatekey); var cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes); } #endregion 非对称加密算法 #region base64 编码/解码 /// /// 编码 /// /// /// /// public static string EncodeBase64(this string code, Encoding encoding) { string encode = ""; byte[] bytes = encoding.GetBytes(code); try { encode = Convert.ToBase64String(bytes); } catch { encode = code; } return encode; } /// /// 解码 /// /// /// /// public static string DecodeBase64(this string code, Encoding encoding) { string decode = ""; byte[] bytes = Convert.FromBase64String(code); try { decode = encoding.GetString(bytes); } catch { decode = code; } return decode; } #endregion } }