ZhiYeJianKang_PeiXun/cyqdata-master/Tool/EncryptHelper.cs

211 lines
7.3 KiB
C#
Raw Normal View History

2025-02-20 15:41:53 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using CYQ.Data;
namespace CYQ.Data.Tool
{
/// <summary>
/// 密码加密类【含Hash算法】
/// </summary>
public static class EncryptHelper
{
#region Hash接口
/// <summary>
/// 【用于分布式】根据字符串获取相应的HashKey
/// </summary>
/// <param name="key">字符串</param>
/// <returns></returns>
public static string GetHashKey(string key)
{
return StaticTool.GetHashKey(key);
}
/// <summary>
/// 【用于分布式】根据字符串获取相应的HashCode
/// </summary>
/// <param name="key">字符串</param>
/// <returns></returns>
public static uint GetHashCode(string key)
{
return HashCreator.CreateCode(key);
}
#endregion
internal static byte[] GetHash(string key)
{
using (MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider())
{
return hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
}
}
private static byte[] _DefaultHashKey;
internal static byte[] DefaultHashKey
{
get
{
if (_DefaultHashKey == null)
{
_DefaultHashKey = GetHash("!1@2#3$4%5^6");
}
return _DefaultHashKey;
}
}
///// <summary>
///// 预留的二次加密
///// </summary>
//internal static string EncryptKey
//{
// get
// {
// return AppConfig.GetApp("EncryptKey", "");
// }
//}
#region
/// <summary>
/// 加密
/// </summary>
/// <param name="text">加密的内容</param>
/// <returns></returns>
public static string Encrypt(string text)
{
return Encrypt(text, "");
}
/// <summary>
/// 加密
/// </summary>
/// <param name="text">加密的内容</param>
/// <param name="key">指定加密的key</param>
public static string Encrypt(string text, string key)
{
string result = Encrypt(text, DefaultHashKey);
if (string.IsNullOrEmpty(key))
{
key = AppConfig.Tool.EncryptKey;
}
if (!string.IsNullOrEmpty(key))
{
result = Encrypt(result, GetHash(key)) + "$2";//设置二级加密标识
}
return result;
}
/// <summary>
/// 3des加密字符串
/// </summary>
/// <param name="text">要加密的字符串</param>
/// <param name="hashKey">密钥</param>
/// <returns>加密后并经base64编码的字符串</returns>
/// <remarks>静态方法采用默认ascii编码</remarks>
private static string Encrypt(string text, byte[] hashKey)
{
string result = string.Empty;
if (!string.IsNullOrEmpty(text))
{
using (TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider())
{
DES.Key = hashKey;
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.UTF8.GetBytes(text);
string pass = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
result = pass.Replace('=', '$').Replace("+", "-").Replace("/", "_");
}
}
return result;
}//end method
/// <summary>
/// 解密
/// </summary>
/// <param name="text">要解密的字符串</param>
/// <returns>解密后的字符串</returns>
public static string Decrypt(string text)
{
return Decrypt(text, "");
}
/// <param name="key">指定加密的key</param>
public static string Decrypt(string text, string key)
{
if (string.IsNullOrEmpty(text))
{
return string.Empty;
}
else
{
text = text.Trim().Replace(' ', '+');//处理Request的+号变空格问题。
if (string.IsNullOrEmpty(key))
{
key = AppConfig.GetApp("EncryptKey", "");
}
if (!string.IsNullOrEmpty(key) && (text.EndsWith("=2") || text.EndsWith("$2")))
{
text = Decrypt(text.Substring(0, text.Length - 2), GetHash(key));//先解一次Key
}
return Decrypt(text, DefaultHashKey);
}
}
/// <summary>
/// 3des解密字符串
/// </summary>
/// <param name="text">要解密的字符串</param>
/// <param name="key">密钥</param>
/// <returns>解密后的字符串</returns>
/// <exception cref="">密钥错误</exception>
/// <remarks>静态方法采用默认ascii编码</remarks>
private static string Decrypt(string text, byte[] hashKey)
{
string result = "";
text = text.Replace('#', '=').Replace("$", "=").Replace("-", "+").Replace("_", "/");
if (text.Length % 4 == 0)
{
using (TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider())
{
DES.Key = hashKey;
DES.Mode = CipherMode.ECB;
ICryptoTransform DESDecrypt = DES.CreateDecryptor();
try
{
byte[] Buffer = Convert.FromBase64String(text);
result = ASCIIEncoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
catch
{
return string.Empty;
}
}
}
return result;
}
internal static bool HashKeyIsValid()
{
string acKey = Decrypt(AppConst.ACKey, AppConst.Host);
acKey = AppConfig.GetConn(acKey);
if (!string.IsNullOrEmpty(acKey))
{
string alKey = Decrypt(AppConst.ALKey, AppConst.Host);
if (!string.IsNullOrEmpty(alKey))
{
string code = AppConfig.GetApp(alKey);
if (!string.IsNullOrEmpty(code))
{
string[] items = Decrypt(code.Substring(4), code.Substring(0, 4)).Split(',');
DateTime d;
if ((DateTime.TryParse(items[0], out d) && d > DateTime.Now) || (items.Length > 1 && items[1] == AppConst.HNKey))
{
AppConfig.SetApp(alKey + AppConst.Result, "1");
return true;
}
}
}
AppConfig.SetApp(alKey + AppConst.Result, "0");
return false;
}
return true;
}
#endregion
}
}