将许可证信息存储在注册表中的最安全方法是什么 - c#

时间:2016-12-27 11:40:35

标签: c# windows winforms registry regedit

我使用win-form C#制作我的应用程序的跟踪版本,因为这样可以在HKEY_CURRENT_USER中存储许可证信息,例如安装日期,上次使用日期和黑名单用户变量。

现在我担心用户可以轻松访问此注册表信息,或者他们可以修改其值。如果他们这样做,那么跟踪应用程序可以在到期后重复使用。

有人,请建议我保护此注册信息的最佳方法。

  1. 如何加密注册表信息?
  2. 如何阻止修改对用户的访问权限,同时只有我的应用程序才有权修改注册表(因为我的应用程序修改了注册表中最后使用的变量。
  3. 我的c#应用程序(一个类似于我的应用程序可以读取和修改其属性数据值的注册表项)可以使用任何其他替代方法来保护此许可证信息。
  4. 我的一段代码

     private void firstTimeAppOpen()
        {
            RegistryKey regkey = Registry.CurrentUser;
            regkey = regkey.CreateSubKey(globalPath); //path
    
            DateTime dt = DateTime.Now;
            string Date = dt.ToShortDateString(); // get only date not time
    
            regkey.SetValue("Install", Date); //Value Name,Value Data
            regkey.SetValue("Use", Date); //Value Name,Value Data
        }
    
        // put next use day in registry
                    regkey.SetValue("Use", DateTime.Now); //Value Name,Value Data
    

    下面的屏幕截图展示了我的所有数据,如安装日期,上次使用的日期都是可见的,如果用户找到它可以修改。 enter image description here

2 个答案:

答案 0 :(得分:1)

简而言之,这种解决方案总是易受攻击。但是,你可以使它变得不方便。

考虑从这些属性计算哈希值并将其存储在注册表中。如果用户尝试修改值,则存储的哈希值将不再与预期值匹配,并且您将知道注册表已被篡改。

聪明的用户可以解决这个系统,但它会阻止随意篡改。

这是一个如何计算哈希值的示例:

var installDate = new DateTime(2016, 12, 28); // replace with registry value
var useDate = new DateTime(2017, 01, 31); // replace with registry value
var inputs = installDate.ToString("yyyy-MM-dd") + "," + useDate.ToString("yyyy-MM-dd");
using (var sha = new System.Security.Cryptography.SHA256CryptoServiceProvider())
{
    var hash = sha.ComputeHash(Encoding.ASCII.GetBytes(inputs));
}

答案 1 :(得分:0)

我在这个问题上找不到任何帮助。正如其他所有文章或帖子所暗示的那样,无法在客户端计算机上保护数据,因为他们可以完全访问自己的计算机。 但是,我们仍然可以将它们与我们的数据混淆,如上面的屏幕截图所示,我可以看到我的注册表数据对所有日期都是公开可见的。所以我正在加密和解密日期。首先,我加密日期并将其存储在注册表中,并在我需要的任何地方再次检索我的注册表数据并解密它以供Furter使用。如果用户篡改加密数据,我们将在解密时了解。

加密和解密的示例代码。

  public string EncryptData(string data)
    {
        if (data == null) 
        throw new ArgumentNullException("data");

        //encrypt data
        var encryptdata = Encoding.Unicode.GetBytes(data);
        byte[] encrypted = ProtectedData.Protect(encryptdata, null, DataProtectionScope.CurrentUser);

        //return as base64 string
        return Convert.ToBase64String(encrypted);
    }

    public string DecryptData(string cipher)
    {
        if (cipher == null) throw new ArgumentNullException("cipher");

        //parse base64 string
        byte[] data = Convert.FromBase64String(cipher);

        //decrypt data
        byte[] decrypted = ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
        return Encoding.Unicode.GetString(decrypted);
    }


private void firstTimeAppOpen()
{
    RegistryKey regkey = Registry.CurrentUser;
    regkey = regkey.CreateSubKey(globalPath); //path

    DateTime dt = DateTime.Now;
    string Date = dt.ToShortDateString(); // get only date not time

    string getDate = EncryptData(Date);

    regkey.SetValue("Install", getDate); //Value Name,Value Data
    regkey.SetValue("Use", getDate); //Value Name,Value Data
}
加密数据后

注册表

enter image description here