当前位置: 首页 > news >正文

咋样做网站视频创建网站

咋样做网站视频,创建网站,同一个域名可以做几个网站吗,wordpress 复制版权Unity开发授权系统 引子 因为有些客户尾款到账不及时,因此研究了一套授权系统,当授权到期后,系统就提示软件授权已到期,不能继续使用云云,这样方便尾款的收回。 大体需求就是 时间相关性,可以自由设置授…

Unity开发授权系统

引子

因为有些客户尾款到账不及时,因此研究了一套授权系统,当授权到期后,系统就提示软件授权已到期,不能继续使用云云,这样方便尾款的收回。

大体需求就是
  • 时间相关性,可以自由设置授权到期日期,到达时间后提示过期。
  • 机器相关性,有时候是按照机器来授权的,需要识别不同的机器,分别给客户授权。

思路和需要的技术点

  • 提取机器特征码,可以参考的思路是:CPU序列号、硬盘序列号、主板序列号、网卡MAC地址等。其中,获取MAC地址最简单,但是也最不稳定,客户网络环境如果比较复杂,比如多张网卡,比如拔插网线可能就会导致网卡状态变化,读取时就会有问题。其余的,相对好一点,推荐几个序列号都读取一下,然后拼接使用。但也不是百分百稳定,毕竟各种厂商设备型号繁杂。问题的关键在于如何获取这些序列号,网络上搜寻的解决方案,全都是使用System.Management,然而,这个其实并不能直接在unity中使用。即便是将Unity InstallPath/Editor/Data/MonoBleedingEdge/lib/mono/2.0-api/System.Management.dll文件引入Unity工程,也会报“未实现”的错。所以最终,我的解决方案是写了一个额外的控制台程序,在这个控制台程序中读取硬件信息,然后输出,在Unity中调用这个控制台程序,在后台去获取硬件信息。这就又引发了一系列其他的问题,比如:假设客户知道了原理,如果他伪造一个读取硬件信息的程序,当我unity去调用时,他就可以返回给我假的硬件特征码,比如无论什么机器都返回一个固定的值,这样他就可以只用一台机器的授权,好几台机器共用了。所以,我Unity在调用之前,必须判断好这个读取硬件特征码的软件,是我的软件,而不是他伪造的。还有一个问题,在unity中,调用的时候,必须是后台调用,不能出现任何界面。
    那么两个问题的解决方法,就是:
    1. 在调用外部进程之前,首先创建一个内存映射文件(MemoryMappedFile,它虽然叫做File,但其实它只需要在内存中,实际并不需要磁盘IO),这个内存映射文件,是可以跨进程共享数据的。读硬件特征码的程序,读到硬件信息后,加密后写到这个内容映射文件中,而不是在控制台输出,这样,这个读取硬件特征的软件,客户就很难替换,因为:①客户不知道内存映射文件对象的名称;②客户不知道加密方式,或者说即便知道加密方式,不知道加密的key,无法向内存映射文件中写如正确数值。这样就避免了客户自行替换读硬件信息的程序。
      提取特征码的具体算法,网络上很多,这里不再赘述。
    2. 在unity中静静的运行一个后台进程,其实很容易,这里以获取控制台输出为例:
// 读取机器码的协程
private static IEnumerator ReadMachineCode()
{// 启动读取硬件特征码的进程string exePath = Path.Combine(Application.streamingAssetsPath, "MachineCode/GetMachineCode.exe");if (!File.Exists(exePath)){OnMachineCodeReaded?.Invoke(null);yield break;}Process process = new Process();process.StartInfo.FileName = exePath;process.StartInfo.Arguments = "Your Some Arguments"; // 据实际情况写process.StartInfo.UseShellExecute = false;process.StartInfo.CreateNoWindow = true;process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;process.StartInfo.WorkingDirectory = Path.Combine(Application.streamingAssetsPath, "MachineCode");process.StartInfo.RedirectStandardOutput = true;process.Start();// 等待进程结束while (!process.HasExited)yield return null;// 获取进程运行结果,以控制台为例,而不是内存文件映射,生产环境应读取内存文件映射中的结果string result = process.StandardOutput.ReadToEnd();OnMachineCodeReaded?.Invoke(result);
}
  • 构建授权数据,本质上是构架一个数据体,用于描述授权文件的信息。然后转换为Json字符串,方便加密和存储。
[Serializable]
internal class MachineLicense
{public string code;  // 目标机器码public string desc;  // 说明public int year;     // 授权到期年public int month;    // 授权到期月public int day;      // 授权到期日
}
[Serializable]
internal class LicenseData
{public string projectName;  // 项目名称public string description;	// 说明public string check;        // 校验字符串public List<MachineLicense> data;  // 授权数据
}
  • AES加密原理,采用AES加密。这也是很成熟的加密算法,下面提供一些与加解密相关的封装好的方法:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;public static class AESCryptography
{// AES加密public static byte[] Encrypt(byte[] rgbKey, byte[] rgbIV, string sourceText){using MemoryStream memoryStream = new MemoryStream();using (Aes aes = Aes.Create())using (ICryptoTransform transform = aes.CreateEncryptor(rgbKey, rgbIV))using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))using (StreamWriter streamWriter = new StreamWriter(cryptoStream)){streamWriter.Write(sourceText);streamWriter.Flush();}return memoryStream.ToArray();}// AES解密public static string Decrypt(byte[] rgbKey, byte[] rgbIV, byte[] cipherBuffer){using MemoryStream stream = new MemoryStream(cipherBuffer);using Aes aes = Aes.Create();using ICryptoTransform transform = aes.CreateDecryptor(rgbKey, rgbIV);using CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Read);using StreamReader streamReader = new StreamReader(cryptoStream);return streamReader.ReadToEnd();}// 字符串MD5加密public static byte[] Md5Encrypt(string tex){var md5 = MD5.Create();return md5.ComputeHash(Encoding.UTF8.GetBytes(tex));}// 将byte[]数据输出为HEX字符串public static string ByteArrayToString(byte [] data){StringBuilder sb = new StringBuilder();int index = 0;foreach( var d in data ){if (index > 0 && index % 4 == 0)sb.Append('-');sb.Append(d.ToString("X2"));++index;}return sb.ToString();}// 将HEX字符串转换为byte[16]public static bool HexStringToByte16(string hex, out byte[] data){data = new byte[16];int index = 0;bool half = true;foreach (var ch in hex){byte d;switch (ch){case >= '0' and <= '9':d = (byte)(ch - '0');break;case >= 'A' and <= 'F':d = (byte)(10 + (ch - 'A'));break;case >= 'a' and <= 'f':d = (byte)(10 + (ch - 'a'));break;case ' ':case '-':case ':':continue;default:return false;}if (half)data[index] = (byte) (d << 4);else{data[index] = (byte) ( data[index] | d );++index;if (index > 15)break;}half = !half;}return true;}
}
  • 制作授权文件,Unity端判定授权无效,或授权到期后,系统会停止工作,并将机器码显示到屏幕上,提示授权到期信息等。我方技术人员获取到机器码后,按照上述算法制作授权文件,经过AES加密,生成Base64字符串,保存到授权文件中,交付客户。
  • 授权验证,客户将授权文件存放到指定路径后,Unity端验证过程:首先读取授权文件,并进行解密,转换为解密后的json字符串,再转换为LicneseData数据,如果校验码等信息全部通过后,再判定当前设备机器码是否在授权文件中,并且授权日期是否到期。完成授权验证。
foreach (var date in from target in licenseData.data where string.CompareOrdinal(target.code, MachineCode) == 0 select new DateTime(target.year, target.month, target.day).AddDays(1))
{OnLicenseChecked?.Invoke(DateTime.Now < date);yield break;
}
OnLicenseChecked?.Invoke(false);
http://www.hkea.cn/news/618402/

相关文章:

  • 万网上传网站seo免费
  • 孝感做网站公司百度热议排名软件
  • 建设网站费用吗廊坊seo快速排名
  • 网站建设公司怎样拓展网站业务大连网站推广
  • 什么网站可以免费做找客户东莞seo建站推广费用
  • 合肥微信网站建设购物网站如何推广
  • 网站建设课程简介图片百度官网认证免费
  • 月夜影视在线观看免费完整版韩剧关键词排名优化报价
  • 做网站的工作时间兰州seo公司
  • css怎么嵌入到html直通车关键词优化口诀
  • 虚拟网站php专业型seo网站关键词排名提升
  • 找人合伙做网站平台b2b电商平台
  • 手机网站建设技术方案找网站设计公司
  • 杭州如何设计公司网站惠州seo网站推广
  • 成都网站建设门户大连企业网站建站模板
  • 游戏卡充值可以做网站吗百度竞价关键词出价技巧
  • 建设企业网站就等于开展网络营销网店推广实训报告
  • dede无法更新网站主页到百度联盟注册
  • wordpress支持爱奇艺企业网站seo托管怎么做
  • 永川做网站的武汉百度快速排名提升
  • 做网站的故意给中病毒网络营销广告
  • 关于阅读类网站的建设规划书友情链接系统
  • 专业做幼儿园设计的网站百度小程序关键词优化
  • 腾龙时时彩做号网站整站优化关键词排名
  • 正规的网站制作与推广百度广告运营
  • 网站建设估价引擎搜索有哪些
  • 东莞网站建设选菲凡网络如何制作网站
  • 网站收录系统备案查询官网
  • 临朐县网站建设利用搜索引擎营销成功的案例
  • 利用网盘做视频网站镇江优化推广