IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> .NET单机软件保护策略(2)软件证书制作 -> 正文阅读

[网络协议].NET单机软件保护策略(2)软件证书制作

单机软件的一个特点是,你毫无保留地把程序都交给用户了。所以,如果软件能够反编译,任何的证书都形同虚设。也正因为此,我们下面所谈的,都是在软件已经过保护,不能反编译为前提的。

软件的认证,一般有三种元素存在:

  • 机器认证:只能在特定的机器上运行。

  • 用户认证:认证跟特定的用户名关联。

  • 时间认证:有固定的有效期,超出时间认证失效。

对于单机软件来说,更多时候是机器认证和时间认证结合,用户认证不太可用,因为用户名可以交给其他人使用。本文先介绍机器认证的方法。

软件证书制作和使用的流程如下图所示:

我们先来看软件证书制作,其步骤为:

  1. 客户软件生成一个机器码,并把机器码交给软件拥有者。

  2. 软件拥有者把机器码跟软件有效期结合在一起,形成软件认证信息的明文。

  3. 使用非对称密钥中的私钥,对明文信息进行签名。

  4. 明文信息和签名结合在一起,即形成软件证书。

而软件证书的使用,也就是验证过程,是跟制作过程基本反过来的:

  1. 客户软件得到证书之后,先分解出明文信息和签名。

  2. 使用非对称密钥中的公钥,对明文信息进行验证。

  3. 客户软件再次生成机器码,跟明文信息中的机器码进行匹配。

  4. 客户软件根据当前时间,跟明文信息中的有效期进行比较。

?

下面解释一下上面所提的数字签名相关的内容。

软件证书里包含机器码和有效期等信息,如果它是以一种明文方式呈现,那用户很容易就能将其修改。所以我们需要对信息进行加密。

我们可以使用一种对称加密的方法,也就是用一个密码加密,用同样的密码解密。我们上面提到过,单机软件就是把整个程序都交给用户了。无论密码藏在哪里,最终是有办法找到的。一旦找到了这个密码,所有软件证书的破解将迎刃而解。所以这种方法是行不通的。

而另外一种方法是,我没办法把密码藏起来,那就直接把密码告诉你好了;我没办法防止你改软件证书,那你随便改好了。关键就在于,证书一旦被修改,软件就能发现。这里使用的是非对称加密的数字签名方法。在非对称加密里,顾名思义,私钥是不能公开的,公钥是能够公开的。它们有两种使用方法:

1. 公钥加密,私钥解密。

2. 私钥加密,公钥验证。

我们这里使用的是第2种方法。下面是C#里使用RSA进行签名和验证的示例代码:

byte[] Sign(byte[] content, string privateKey)
{
    var sha256 = new SHA256CryptoServiceProvider();
    byte[] hash = sha256.ComputeHash(content);

    RSACryptoServiceProvider key = new RSACryptoServiceProvider();
    key.FromXmlString(privateKey);

    RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
    formatter.SetHashAlgorithm("SHA256");
    return formatter.CreateSignature(hash);
}

bool CheckSign(byte[] content, string publicKey, byte[] signData)
{
    try
    {
        var sha256 = new SHA256CryptoServiceProvider();
        byte[] hash = sha256.ComputeHash(content);

        RSACryptoServiceProvider key = new RSACryptoServiceProvider();
        key.FromXmlString(publicKey);

        RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);
        deformatter.SetHashAlgorithm("SHA256");
        if (deformatter.VerifySignature(hash, signData))
        {
            return true;
        }
        return false;
    }
    catch
    {
        return false;
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:56:53  更:2021-11-19 17:57:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 22:54:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码