SoftAuthorize.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System;
  2. using System.Management;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. using Newtonsoft.Json.Linq;
  6. namespace HslCommunication.BasicFramework
  7. {
  8. /// <summary>
  9. /// 软件授权类
  10. /// </summary>
  11. public class SoftAuthorize : SoftFileSaveBase
  12. {
  13. #region Constructor
  14. /// <summary>
  15. /// 实例化一个软件授权类
  16. /// </summary>
  17. public SoftAuthorize()
  18. {
  19. machine_code = GetInfo();
  20. LogHeaderText = "SoftAuthorize";
  21. }
  22. #endregion
  23. #region Static Members
  24. /// <summary>
  25. /// 注册码描述文本
  26. /// </summary>
  27. public static readonly string TextCode = "Code";
  28. #endregion
  29. #region Private Members
  30. private string FinalCode { get; set; } = "";
  31. /// <summary>
  32. /// 是否正式发行版,是的话就取消授权
  33. /// </summary>
  34. public bool IsReleaseVersion { get; set; } = false;
  35. /// <summary>
  36. /// 指示是否加载过文件信息
  37. /// </summary>
  38. private bool HasLoadByFile { get; set; } = false;
  39. private string machine_code = "";
  40. #endregion
  41. #region Public Members
  42. /// <summary>
  43. /// 指示系统是否处于试用运行
  44. /// </summary>
  45. public bool IsSoftTrial { get; set; } = false;
  46. #endregion
  47. #region Public Method
  48. /// <summary>
  49. /// 获取本机的机器码
  50. /// </summary>
  51. /// <returns></returns>
  52. public string GetMachineCodeString()
  53. {
  54. return machine_code;
  55. }
  56. /// <summary>
  57. /// 获取需要保存的数据内容
  58. /// </summary>
  59. /// <returns></returns>
  60. public override string ToSaveString()
  61. {
  62. //JObject json = new JObject
  63. //{
  64. // { TextCode, new JValue(FinalCode) }
  65. //};
  66. //return json.ToString();
  67. return "";
  68. }
  69. /// <summary>
  70. /// 从字符串加载数据
  71. /// </summary>
  72. /// <param name="content"></param>
  73. public override void LoadByString(string content)
  74. {
  75. JObject json = JObject.Parse(content);
  76. FinalCode = SoftBasic.GetValueFromJsonObject(json, TextCode, FinalCode);
  77. HasLoadByFile = true;
  78. }
  79. /// <summary>
  80. /// 使用特殊加密算法加密数据
  81. /// </summary>
  82. public override void SaveToFile()
  83. {
  84. SaveToFile(m => SoftSecurity.MD5Encrypt(m));
  85. }
  86. /// <summary>
  87. /// 使用特殊解密算法解密数据
  88. /// </summary>
  89. public override void LoadByFile()
  90. {
  91. LoadByFile(m => SoftSecurity.MD5Decrypt(m));
  92. }
  93. /// <summary>
  94. /// 检查该注册码是否是正确的注册码
  95. /// </summary>
  96. /// <param name="code"></param>
  97. /// <param name="encrypt">数据加密的方法,必须用户指定</param>
  98. /// <returns>是否注册成功</returns>
  99. public bool CheckAuthorize(string code, Func<string, string> encrypt)
  100. {
  101. if (code != encrypt(GetMachineCodeString()))
  102. {
  103. return false;
  104. }
  105. else
  106. {
  107. FinalCode = code;
  108. SaveToFile();
  109. return true;
  110. }
  111. }
  112. /// <summary>
  113. /// 检测授权是否成功
  114. /// </summary>
  115. /// <param name="encrypt">数据加密的方法,必须用户指定</param>
  116. /// <returns>是否成功授权</returns>
  117. public bool IsAuthorizeSuccess(Func<string, string> encrypt)
  118. {
  119. if (IsReleaseVersion) return true;
  120. if (encrypt(GetMachineCodeString()) == FinalCode)
  121. {
  122. return true;
  123. }
  124. else
  125. {
  126. FinalCode = "";
  127. SaveToFile();
  128. return false;
  129. }
  130. }
  131. #endregion
  132. #region Static Method
  133. /// <summary>
  134. /// 获取本计算机唯一的机器码
  135. /// </summary>
  136. /// <returns></returns>
  137. public static string GetInfo()
  138. {
  139. string unique = "";
  140. // 获取处理器信息
  141. ManagementClass cimobject = new ManagementClass("Win32_Processor");
  142. ManagementObjectCollection moc = cimobject.GetInstances();
  143. foreach (ManagementObject mo in moc)
  144. {
  145. unique += mo.Properties["ProcessorId"].Value.ToString();
  146. }
  147. // 获取硬盘ID
  148. ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");
  149. ManagementObjectCollection moc1 = cimobject1.GetInstances();
  150. foreach (ManagementObject mo in moc1)
  151. {
  152. unique += (string)mo.Properties["Model"].Value;
  153. break;
  154. }
  155. // 获取BIOS
  156. ManagementObjectSearcher searcher =
  157. new ManagementObjectSearcher("Select SerialNumber From Win32_BIOS");
  158. ManagementObjectCollection moc2 = searcher.Get();
  159. if (moc2.Count > 0)
  160. {
  161. foreach (ManagementObject share in moc2)
  162. {
  163. unique += share["SerialNumber"].ToString();
  164. }
  165. }
  166. MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
  167. return SoftBasic.ByteToHexString(md5.ComputeHash(Encoding.Unicode.GetBytes(unique))).Substring(0, 25);
  168. }
  169. #endregion
  170. }
  171. }