2016-12-27 2 views
-2

Win-form C#을 사용하여 내 응용 프로그램의 트레일 버전을 만듭니다. 설치 날짜, 마지막 사용 날짜 및 블랙리스트 사용자 변수와 같은 라이센스 정보를 저장합니다. HKEY_CURRENT_USER.라이센스 정보를 레지스트리에 저장하는 가장 안전한 방법은 무엇입니까? - C#

사용자가이 레지스트리 정보에 쉽게 액세스 할 수 있거나 값을 수정할 수 있다고 걱정됩니다. 그들이 그렇게한다면 트레일 앱은 만료 후에 재사용 될 수 있습니다.

누군가가이 레지스트리 정보를 보호하는 가장 좋은 방법을 제안합니다.

  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 

는 것을 전시 설치 날짜, 마지막으로 사용한 날짜 등 모든 데이터가 표시되며 사용자가 찾으면 수정할 수 있습니다. enter image description here

+0

는 일반적으로 사용자는 자신의 컴퓨터의 소유자입니다. 자신의 컴퓨터를 수정할 수 없다는 가정을해서는 안됩니다.다른 방법을 검색하여 평가판 소프트웨어의 유효성을 검사하십시오. 재판의 유효성을 검사하기 위해 웹 서비스를 사용하는 것이 더 강력하지만 깨지기 쉬운 것은 아닙니다. – Steve

+0

물론 원격 라이센스가 가장 안전한 방법입니다. 그러나 자원 부족으로 우리는 선택할 수 없습니다. 클라이언트 컴퓨터에서 남용을 피할 수있는 몇 가지 대안을 선호합니까? – kaviarasan

+1

환영합니다! 슬프게도 당신의 질문은 너무 광범위하고 "최고"는 의견의 대상입니다. 코드를 표시하는 것이 좋지만 슬프게도 보안에 대한 시도는 없습니다. [0123] A - – MickyD

답변

0

는이 질문에 아무런 도움을 찾을 수 없습니다. 다른 모든 기사 또는 게시물에 나와 있듯이 고객의 컴퓨터에 대한 모든 액세스 권한을 보유하고 있으므로 고객의 컴퓨터에서 데이터를 보호 할 수 없음을 알립니다. 그러나 위의 스크린 샷에서 알 수 있듯이 내 레지스트리 데이터가 공개적으로 날짜와 같이 모두 볼 수 있으므로 데이터를 Google 데이터와 혼동 할 수 있습니다. 그래서 날짜를 암호화하고 해독합니다. 처음에는 날짜를 암호화하여 레지스트리에 저장하고 필요한 경우 어디에서나 레지스트리 데이터를 검색하고 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)); 
}