我使用win-form C#制作我的应用程序的跟踪版本,因为这样可以在HKEY_CURRENT_USER中存储许可证信息,例如安装日期,上次使用日期和黑名单用户变量。
现在我担心用户可以轻松访问此注册表信息,或者他们可以修改其值。如果他们这样做,那么跟踪应用程序可以在到期后重复使用。
有人,请建议我保护此注册信息的最佳方法。
我的一段代码
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
答案 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
}
加密数据后注册表