284 lines
9.5 KiB
C#
284 lines
9.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
using System.Xml;
|
||
|
||
namespace Common
|
||
{
|
||
public static class MyDes
|
||
{
|
||
public const string AuthorizationCode = "D7CD0C3660F6A658C9668233516A5397";
|
||
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(MyDes));
|
||
private static System.Security.Cryptography.DES mydes = new DESCryptoServiceProvider();
|
||
private static string m_key = "szblw_license";
|
||
private static string m_iv = "szblw_license";
|
||
private static object _lock = new object();
|
||
|
||
private static byte[] GetLegalKey()
|
||
{
|
||
string sTemp = m_key;
|
||
mydes.GenerateKey();
|
||
byte[] bytTemp = mydes.Key;
|
||
int KeyLength = bytTemp.Length;
|
||
if (sTemp.Length > KeyLength)
|
||
sTemp = sTemp.Substring(0, KeyLength);
|
||
else if (sTemp.Length < KeyLength)
|
||
sTemp = sTemp.PadRight(KeyLength, ' ');
|
||
return ASCIIEncoding.ASCII.GetBytes(sTemp);
|
||
}
|
||
|
||
private static byte[] GetLegalIV()
|
||
{
|
||
string sTemp = m_iv;
|
||
mydes.GenerateIV();
|
||
byte[] bytTemp = mydes.IV;
|
||
int IVLength = bytTemp.Length;
|
||
if (sTemp.Length > IVLength)
|
||
sTemp = sTemp.Substring(0, IVLength);
|
||
else if (sTemp.Length < IVLength)
|
||
sTemp = sTemp.PadRight(IVLength, ' ');
|
||
return ASCIIEncoding.ASCII.GetBytes(sTemp);
|
||
}
|
||
|
||
#region 解密 License
|
||
|
||
/// <summary>
|
||
/// 解密文件
|
||
/// </summary>
|
||
/// <param name="inFileName"></param>
|
||
/// <param name="key"></param>
|
||
/// <param name="iv"></param>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool DecodeFromFile(string inFileName, ref string result)
|
||
{
|
||
return Decode(File.ReadAllText(inFileName), ref result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 解密文件
|
||
/// </summary>
|
||
/// <param name="inFileName"></param>
|
||
/// <param name="key"></param>
|
||
/// <param name="iv"></param>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool DecodeFromStream(Stream stream, ref string result)
|
||
{
|
||
using (StreamReader reader = new StreamReader(stream))
|
||
{
|
||
return Decode(reader.ReadToEnd(), ref result);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 解密文件
|
||
/// </summary>
|
||
/// <param name="base64License"></param>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool Decode(string base64License, ref string result)
|
||
{
|
||
try
|
||
{
|
||
mydes.IV = GetLegalIV();
|
||
mydes.Key = GetLegalKey();
|
||
byte[] btFile = Convert.FromBase64String(base64License);
|
||
ICryptoTransform encrypto = mydes.CreateDecryptor();
|
||
using (MemoryStream mStream = new MemoryStream())
|
||
{
|
||
using (CryptoStream encStream = new CryptoStream(mStream, encrypto, CryptoStreamMode.Write))
|
||
{
|
||
encStream.Write(btFile, 0, btFile.Length);
|
||
encStream.FlushFinalBlock();
|
||
result = Encoding.UTF8.GetString(mStream.ToArray());
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
result = "解密文件失败!原因:" + ex.Message;
|
||
if (logger.IsErrorEnabled)
|
||
{
|
||
logger.Error(result, ex);
|
||
}
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 验证License
|
||
|
||
/// <summary>
|
||
/// 每次登录验证,验证成功时修改License文件的最后写入时间
|
||
/// </summary>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool Validate(ref string result)
|
||
{
|
||
string file = GetLicensePath();
|
||
if (!System.IO.File.Exists(file))
|
||
{
|
||
result = "授权文件不存在!";
|
||
return false;
|
||
}
|
||
string strLicense = "";
|
||
if (!DecodeFromFile(file, ref strLicense))
|
||
{
|
||
result = "无效的授权文件!";
|
||
return false;
|
||
}
|
||
bool ret = Validate(strLicense, ref result);
|
||
if (ret)
|
||
{
|
||
File.SetLastWriteTime(file, DateTime.Now);
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导入授权文件验证
|
||
/// </summary>
|
||
/// <param name="licenseStream"></param>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool ImportValidate(Stream licenseStream, ref string result)
|
||
{
|
||
string strLicense = "";
|
||
if (!Common.MyDes.DecodeFromStream(licenseStream, ref strLicense))
|
||
{
|
||
result = "无效的授权文件!";
|
||
return false;
|
||
}
|
||
|
||
return Validate(strLicense, ref result);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证 License文件
|
||
/// </summary>
|
||
/// <param name="strLicense"></param>
|
||
/// <param name="result"></param>
|
||
/// <returns></returns>
|
||
public static bool Validate(string strLicense, ref string result)
|
||
{
|
||
License license = ReadLicense(strLicense);
|
||
if (license == null)
|
||
{
|
||
result = "无效的授权文件!";
|
||
return false;
|
||
}
|
||
if (license.SystemTypeID != 0)
|
||
{
|
||
result = "授权文件不匹配本系统!";
|
||
return false;
|
||
}
|
||
//判断授权文件上的机器码是否符合当前电脑的机器码,如机器码是12个0,不做校验
|
||
if (license.MAC != Tools.GetMachineCode())
|
||
{
|
||
result = "机器码与授权文件不匹配!";
|
||
return false;
|
||
}
|
||
DateTime now = GetServerDate();
|
||
if (now < license.StartDate || now > license.EndDate)
|
||
{
|
||
result = "授权到期!";
|
||
return false;
|
||
}
|
||
result = "验证成功!";
|
||
return true;
|
||
}
|
||
|
||
private static DateTime GetServerDate()
|
||
{
|
||
DateTime nowDate = DateTime.Now.Date;
|
||
string file = GetLicensePath();
|
||
if (!File.Exists(file))
|
||
{
|
||
return nowDate;
|
||
}
|
||
DateTime fileTime = File.GetLastWriteTime(file);
|
||
if (fileTime > DateTime.Now)
|
||
{
|
||
return fileTime.Date;
|
||
}
|
||
return nowDate;
|
||
}
|
||
|
||
#endregion
|
||
|
||
public static License GetLicense()
|
||
{
|
||
string result = "";
|
||
if (DecodeFromFile(GetLicensePath(), ref result))
|
||
{
|
||
return ReadLicense(result);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public static string GetLicensePath()
|
||
{
|
||
return Tools.GetApplicationPath() + @"License\blw-t3s.lic";
|
||
}
|
||
|
||
public static License ReadLicense(string strLicense)
|
||
{
|
||
try
|
||
{
|
||
lock (_lock)
|
||
{
|
||
if (strLicense.Contains("<?"))
|
||
{
|
||
strLicense = strLicense.Substring(strLicense.IndexOf('>') + 1);//去掉xml header
|
||
}
|
||
XmlDocument doc = new XmlDocument();
|
||
doc.LoadXml(strLicense);
|
||
XmlNode data = doc.DocumentElement.GetElementsByTagName("data")[0];
|
||
License license = new License()
|
||
{
|
||
ID = data.Attributes["id"].Value,
|
||
CustomerID = data.Attributes["customerid"].Value,
|
||
Customer = data.Attributes["customer"].Value,
|
||
SN = data.Attributes["sn"].Value,
|
||
Key = data.Attributes["key"].Value,
|
||
MAC = data.Attributes["mac"].Value,
|
||
Limit = Convert.ToInt32(data.Attributes["limit"].Value),
|
||
StartDate = Convert.ToDateTime(data.Attributes["start"].Value),
|
||
EndDate = Convert.ToDateTime(data.Attributes["end"].Value),
|
||
SystemTypeID = Convert.ToInt32(data.Attributes["systemtypeid"].Value)
|
||
};
|
||
data = null;
|
||
doc = null;
|
||
GC.Collect();
|
||
return license;
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
logger.Error(string.Format("读取license失败:{0}", ex.ToString()));
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
|
||
public class License
|
||
{
|
||
public string ID { get; set; }
|
||
public string CustomerID { get; set; }
|
||
public string Customer { get; set; }
|
||
public string SN { get; set; }
|
||
public string Key { get; set; }
|
||
public string MAC { get; set; }
|
||
public int Limit { get; set; }
|
||
public DateTime StartDate { get; set; }
|
||
public DateTime EndDate { get; set; }
|
||
public int SystemTypeID { get; set; }
|
||
}
|
||
}
|