asp.net-core - 如何使用证书保护 .Net Core 应用程序以进行试用
问题描述
这个想法是在 .Net Core 应用程序中放置一个定时炸弹(它是测试版/试用版,不是完全可用的产品,从法律的角度来看是可以的)。
我想使用 X509 证书来实现这一点,但很难理解它是如何工作的以及需要做什么。
到目前为止,使用 OpenSSL,我创建了一个私钥(我们称之为 trial.key):
openssl genrsa -des3 -out trial.key 2048
,然后使用 -days 参数 (trial.pem) 和密码“password”创建证书:
openssl req -x509 -new -nodes -key trial.key -sha256 -days 4 -out trial.pem
然后结束 trial.cert:
openssl x509 -outform der -in trial.pem -out trial.crt
我将 trial.crt 添加到应用程序并在启动时检查日期:
private static void CheckTrialCert()
{
var trialCert = new X509Certificate2(Path.Combine("Certificates", "trial.crt"), "password");
if (trialCert.NotAfter < DateTime.Now)
{
Environment.Exit(0);
};
}
问题是用户可以在磁盘上找到 trial.crt 并用自己创建的证书替换它,没有时间限制(假设他知道密码)并使用该应用程序。
在这里可以做什么?有没有办法可以在应用程序中对私钥进行硬编码并检查 trial.crt 是否已使用我的私钥签名?
解决方案
您可以尝试将证书直接嵌入代码中。但是,这不会阻止知识渊博的用户滥用您的限制。.NET 应用程序可以轻松反编译,可以使用 ildasm.exe 等工具跟踪和修改逻辑。换句话说,您要完成的工作是针对未受过教育的用户。
要更难地进行反编译,您可以使用 .NET 混淆工具。但是它们有一些副作用,例如损坏的异常堆栈跟踪。考虑到可能的负面影响,您需要在安全性、可维护性和实施成本之间找到平衡点。
但是,考虑到这一切,请记住,没有 100% 抵抗的解决方案,任何应用程序都可以被破解,问题在于破解它的成本。
推荐阅读
- precision - 数字系统中的浮点表示
- testing - TypeError:“模块”对象在机器人框架中不可调用错误
- r - 将多列中的每 N 行转置为新列
- javascript - 如何确保在一个窗口上只使用一个选项卡
- javascript - JavaScript/jQuery 不读取 Node Js sqlResponse 值
- sh - 我可以在开始时获得 ros-score 吗?
- spartacus-storefront - SAP Commerce for Store Finder 中现有但未使用的 API
- python - 无法理解break的区别和作用
- android - 无法将库模块依赖项添加到动态功能模块
- python - Python:从图像中提取文本