1

我有一些接受许可证加密密钥的应用程序。所以这个应用程序应该保留在里面string encryptionPassword ,以便解密该字符串并获取一些数据。

哪种方法最好保留string encryptionPassword在应用程序内部,所以如果用户试图破解它并且应该非常难以做到?

有什么线索吗?

谢谢!!!

public static string Encrypt(string textToEncrypt, string encryptionPassword)
{
            var algorithm = GetAlgorithm(encryptionPassword);

            byte[] encryptedBytes;
            using (ICryptoTransform encryptor = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV))
            {
                byte[] bytesToEncrypt = Encoding.UTF8.GetBytes(textToEncrypt);
                encryptedBytes = InMemoryCrypt(bytesToEncrypt, encryptor);
            }
            return Convert.ToBase64String(encryptedBytes);
}

public static string Decrypt(string encryptedText, string encryptionPassword)
{
            var algorithm = GetAlgorithm(encryptionPassword);

            byte[] descryptedBytes;
            using (ICryptoTransform decryptor = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV))
            {
                byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
                descryptedBytes = InMemoryCrypt(encryptedBytes, decryptor);
            }
            return Encoding.UTF8.GetString(descryptedBytes);
}
4

3 回答 3

5

SecureString可能符合要求:

表示应保密的文本。文本在使用时被加密以保护隐私,并在不再需要时从计算机内存中删除。

还:

对象与对象的SecureString相似之处String在于它具有文本值。但是,SecureString对象的值是自动加密的,可以修改,直到您的应用程序将其标记为只读,并且可以由您的应用程序或 .NET Framework 垃圾收集器从计算机内存中删除。

实例的值在SecureString初始化实例或修改值时会自动加密。MakeReadOnly您的应用程序可以通过调用该方法使实例不可变并防止进一步修改。

但是请注意,确定足够多的用户将设法读取这样的密码 - 这可能需要时间和精力,但这是可能的

于 2012-12-17T14:54:29.410 回答
1

存储密钥以防止黑客攻击的最佳答案是:您不需要.

有关替代方法,请参阅本文。

该解决方案称为部分密钥验证系统,因为您的软件从不测试完整密钥。由于您的应用程序不包含测试密钥每个部分的代码,因此破解者不可能仅通过反汇编您的可执行代码来构建有效的有效密钥生成器。

该系统不是完全防止裂缝的方法。破解者仍然可以编辑您的可执行文件以跳过验证码。但是这样的破解只适用于一个特定的版本,我会建议一些技巧来让他们的工作更难成功完成。

于 2012-12-17T15:21:15.293 回答
0

您应该尝试使用安全字符串。它会自动加密内存中的字符串值。

于 2012-12-17T14:55:28.267 回答