Unity实用功能之程序加密(一)- 通过时间验证

1,057 阅读3分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

概述

在项目开发出来发给他人进行体验时,有时候会怕程序被白嫖,加密设备又不需要,有点小题大做,所以就有了时间加密程序一说。此功能就是给程序添加一个显示,使其不能无限的使用,只能在规定的时间内进行体验,这是我们就需要给程序添加一个时间限制,比如,到yyyy年MM月dd日之后就无法使用此软件。但是此方法也有一个弊端,那就是对一些人群比如说搞开发的人可能就会轻而易举的无视这个加密了。

分析

时间加密,其实就是获取一个本地时间/网络时间,然后和我们设定的时间进行对比,如果我们设定的是时间在获取到的时间之后,那么就可以进行软件体验,否则程序自动退出或黑屏等(可由用户自己编辑)

优缺点

优点:

  • 可以对程序起到一个保护作用,防止劳动成果被窃取 缺点:
  • 使用网络时间加密,设备必须联网获取才能够使用
  • 使用本地时间加密,只要修改系统时间在设定的时间之前,那么程序就可以无限制的使用下去。

功能实现

时间获取

第一步是获取时间,正常来说加密使用的时间一般都是在程序启动的时候获取一次即可,如果想要实时验证也可以,只需要写个协程,设定个循环获取时间即可。

获取本地时间

Unity中获取本地时间的方法非常简单,只需要一句话。前提是需要命名空间:using UnityEngine;

System.DateTime date1 = System.DateTime.Now;//系统时间
int nowYear = date.Year;//年
int nowMouth = date.Month;//月
int nowDay = date.Day;//日

获取网络时间

获取网络时间,顾名思义,就是程序需要联网进行时间获取,如果设备没联网获取不成功,就会直接退出。这里使用的是WebRequest 获取网络时间代码如下:成功返回时间字符串,不成功返回空。我们主要验证日期,所以只要日期不要时间即可,使用ToString("yyyy-MM-dd")设置时间格式

public string GetNetDateTime()
{
    WebRequest request = null;
    WebResponse response = null;
    WebHeaderCollection headerCollection = null;
    string datetime = string.Empty;
    DateTime timeNow = DateTime.MinValue;
    try
    {
        request = WebRequest.Create("https://www.baidu.com");
        request.Timeout = 3000;
        request.Credentials = CredentialCache.DefaultCredentials;
        response = (WebResponse)request.GetResponse();
        headerCollection = response.Headers;
        foreach (var h in headerCollection.AllKeys)
        {
            if (h == "Date")
            {
                datetime = headerCollection[h];
                timeNow = Convert.ToDateTime(datetime);
            }
        }
        return timeNow.ToString("yyyy-MM-dd");
    }
    catch (Exception)
    {
        Debug.Log("获取网络时间错误");
        return null;
    }
    finally
    {
        if (request != null)
        { request.Abort(); }
        if (response != null)
        { response.Close(); }
        if (headerCollection != null)
        { headerCollection.Clear(); }
    }
}

时间验证

时间已经获取到了,那么接下来就是进行和设置的时间进行比对。首先对时间进行截取,上面提到时间格式的问题,这里使用的是yyyy-MM-dd即如:2021-08-27
时间截取,使用Split('-')将其截成string数组,然后在将其转成int类型比较好进行比较

Convert.ToInt32(Date.Split('-')[0])//年
Convert.ToInt32(Date.Split('-')[1])//月
Convert.ToInt32(Date.Split('-')[2])//日

判断顺序是,相判断年,然后再判断月,最后判断日期,具体实现逻辑如下

        //通过对比现在的时间进行判断是否到加密的时间
        if (year < Convert.ToInt32(Date.Split('-')[0]))
        {
            //验证通过在这里执行方法
        }
        else if (year == Convert.ToInt32(Date.Split('-')[0]))
        {
            if (mouth < Convert.ToInt32(Date.Split('-')[1]))
            {
                //验证通过在这里执行方法
            }
            else if (mouth == Convert.ToInt32(Date.Split('-')[1]))
            {
                if (day <= Convert.ToInt32(Date.Split('-')[2]))
                {
                    //验证通过在这里执行方法
                }
                else
                {
#if UNITY_EDITOR
                    UnityEditor.EditorApplication.isPlaying = false;
#else
             Application.Quit();
#endif
                }
            }
            else
            {
#if UNITY_EDITOR
                UnityEditor.EditorApplication.isPlaying = false;
#else
             Application.Quit();
#endif
            }

        }
        else
        {
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#else
             Application.Quit();
#endif
        }

实现效果

展示19.gif

源代码分享

GitHub下载地址:点击这里跳转下载

源代码中有一个枚举,可以进行验证方式的选择,有一个公开的string类型,可供设定加密日期

写在最后

所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。欢迎大家相互学习进步。本片文章就先写到这里,希望对你能够有所帮助