2016-12-27 2 views
-2

Я создаю версию своего приложения с использованием win-form C#, для этого сохраняю информацию о лицензии, такую ​​как дата установки, последняя используемая дата и пользовательские переменные черного списка в HKEY_CURRENT_USER.Что является самым безопасным способом хранения информации о лицензии в реестре - C#

Теперь я обеспокоен тем, что пользователи могут легко получить доступ к этой информации реестра или могут изменить ее значение. Если они это сделают, то приложение trail может быть повторно использовано после истечения срока действия.

Кто-нибудь, пожалуйста, предложите мне лучший способ защитить данные реестра.

  1. как шифровать данные реестра?
  2. Как заблокировать изменение доступа к пользователям, и в то же время только мое приложение должно иметь права на изменение реестра (так как мое приложение изменяет последнюю используемую переменную в реестре.
  3. Любые другие варианты защиты этой информации и То же самое может быть использовано моей C# приложение (один аналогично записи реестра, где мое приложение может считывать и изменять свои значения данных свойства)

кусок моего кода

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 

ниже скриншот демонстрирует, что ll мои данные, такие как дата установки, последняя используемая дата, все видны и могут быть изменены, если пользователь ее найдет. enter image description here

+0

Обычно пользователь является владельцем своей собственной машины. Вы не должны делать предположение, что он не может изменить свою СОБСТВЕННУЮ машину.Найдите другой метод проверки пробного программного обеспечения. Использование веб-службы для проверки пробности является более надежным, но оно не является нерушимым. – Steve

+0

, конечно, дистанционное лицензирование - лучший безопасный способ. Но из-за нехватки ресурсов мы не можем это сделать. поэтому предпочитаете некоторые альтернативы, где я могу обойти злоупотребления с клиентской машины? – kaviarasan

+1

Добро пожаловать! К сожалению, ваш вопрос слишком широк, и «лучшее» подлежит обсуждению. Хорошо, что вы показываете какой-то код, но, к сожалению, нет никаких попыток безопасности. [ask] - – MickyD

ответ

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

+0

Что, если весь ключ «D \ New Folder (2)» просто удален? Тогда для вашего приложения это выглядит как первая установка и новый демо/пробный период . – Tom

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)); 
} 
Смежные вопросы