2016-12-27 59 views
-2

我使用雙贏的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

通常用戶是其自己的機器的所有者。你不應該假設他不能修改自己的機器。搜索另一種方法來驗證您的試用軟件。使用Web服務來驗證試用版更加強大,但它並非牢不可破。 – Steve

+0

當然,遠程許可是最安全的方式。但由於缺乏資源,我們無法選擇。因此寧願選擇一些可以繞過客戶機器濫用的替代方案? – kaviarasan

+1

歡迎!可悲的是,你的問題太廣泛了,「最好」的觀點是有問題的。你展示一些代碼是很好的,但可悲的是沒有任何安全的嘗試。 [問] - – 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)); 
} 
相關問題