474 lines
15 KiB
C#
Raw Normal View History

2025-06-04 09:42:48 +08:00
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
/// <summary>
/// 哈希加密算法
/// </summary>
/// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param>
/// <param name="input"> 待加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
private static string HashEncrypt(HashAlgorithm hashAlgorithm, string input, Encoding encoding)
{
var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input.ToCharArray()));
return BitConverter.ToString(data).Replace("-", "");
}
/// <summary>
/// 验证哈希值
/// </summary>
/// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param>
/// <param name="unhashedText"> 未加密的字符串 </param>
/// <param name="hashedText"> 经过加密的哈希值 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// MD5 加密
/// </summary>
/// <param name="input"> 待加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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;
}
/// <summary>
/// MD5对比
/// </summary>
/// <param name="input"> 未加密的字符串 </param>
/// <param name="input"> 未密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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());
}
/// <summary>
/// 获取文件的MD5摘要
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string AbstractFile(string fileName)
{
using (FileStream file = new FileStream(fileName, FileMode.Open))
{
return AbstractFile(file);
}
}
/// <summary>
/// 根据stream获取文件摘要
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
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
/// <summary>
/// SHA1 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static string SHA1Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA1.Create(), input, encoding);
}
/// <summary>
/// 验证 SHA1 值
/// </summary>
/// <param name="input"> 未加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static bool VerifySHA1Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA1.Create(), input, SHA1Encrypt(input, encoding), encoding);
}
#endregion SHA1
#region SHA256
/// <summary>
/// SHA256 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static string SHA256Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA256.Create(), input, encoding);
}
/// <summary>
/// 验证 SHA256 值
/// </summary>
/// <param name="input"> 未加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static bool VerifySHA256Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA256.Create(), input, SHA256Encrypt(input, encoding), encoding);
}
#endregion SHA256
#region SHA384
/// <summary>
/// SHA384 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static string SHA384Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA384.Create(), input, encoding);
}
/// <summary>
/// 验证 SHA384 值
/// </summary>
/// <param name="input"> 未加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static bool VerifySHA384Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA256.Create(), input, SHA384Encrypt(input, encoding), encoding);
}
#endregion SHA384
#region SHA512
/// <summary>
/// SHA512 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static string SHA512Encrypt(string input, Encoding encoding)
{
return HashEncrypt(SHA512.Create(), input, encoding);
}
/// <summary>
/// 验证 SHA512 值
/// </summary>
/// <param name="input"> 未加密的字符串 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
public static bool VerifySHA512Value(string input, Encoding encoding)
{
return VerifyHashValue(SHA512.Create(), input, SHA512Encrypt(input, encoding), encoding);
}
#endregion SHA512
#region HMAC-MD5
/// <summary>
/// HMAC-MD5 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="key"> 密钥 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// HMAC-SHA1 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="key"> 密钥 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// HMAC-SHA256 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="key"> 密钥 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// HMAC-SHA384 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="key"> 密钥 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// HMAC-SHA512 加密
/// </summary>
/// <param name="input"> 要加密的字符串 </param>
/// <param name="key"> 密钥 </param>
/// <param name="encoding"> 字符编码 </param>
/// <returns></returns>
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
/// <summary>
/// DES 加密
/// </summary>
/// <param name="input"> 待加密的字符串 </param>
/// <param name="key"> 密钥8位 </param>
/// <returns></returns>
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;
}
}
/// <summary>
/// DES 解密
/// </summary>
/// <param name="input"> 待解密的字符串 </param>
/// <param name="key"> 密钥8位 </param>
/// <returns></returns>
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
/// <summary>
/// 生成 RSA 公钥和私钥
/// </summary>
/// <param name="publicKey"> 公钥 </param>
/// <param name="privateKey"> 私钥 </param>
public static void GenerateRSAKeys(out string publicKey, out string privateKey)
{
using (var rsa = new RSACryptoServiceProvider())
{
publicKey = rsa.ToXmlString(false);
privateKey = rsa.ToXmlString(true);
}
}
/// <summary>
/// RSA 加密
/// </summary>
/// <param name="publickey"> 公钥 </param>
/// <param name="content"> 待加密的内容 </param>
/// <returns> 经过加密的字符串 </returns>
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);
}
/// <summary>
/// RSA 解密
/// </summary>
/// <param name="privatekey"> 私钥 </param>
/// <param name="content"> 待解密的内容 </param>
/// <returns> 解密后的字符串 </returns>
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 /
/// <summary>
/// 编码
/// </summary>
/// <param name="encoding"></param>
/// <param name="code"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="encoding"></param>
/// <param name="code"></param>
/// <returns></returns>
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
}
}