2025-06-16 17:24:23 +08:00

474 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}