前言
在之前的文章中,我们介绍了什么是对称加密什么是非对称加密,同时我们在文章中我们留下了一个疑问,那就是如何确认公钥和数据就是对方的而不是伪造的,今天这篇文章我们就聊聊相关的技术,签名与证书,非常有用,注意听讲哈
签名
平时我们说的签名更多是签个名字,比如有个文件需要经过我的确认,我再确认后需要拿起笔签上名字,证明这个文件是我已经同意了的。这里的关键点就是笔迹。
那么在数字世界中,如果我需要对方发送一个文件给我,我如何确认我所接收到的文件就是对方发送给我的而不是有人恶意伪造的呢?或者我该如何确认对方发送给我的文件不是经过有人篡改后的呢?
答案就是数字签名,数字签名使用的核心技术是哈希算法和非对称加密,如果大家对非对称加密不了解可以参考之前的文章
哈希算法(HASH)
本篇文章不对哈希算法做详细的说明,只做一个简单的介绍,让大家知道什么是哈希算法
所谓的哈希算法也称为“散列函数”或“哈希函数”,听名字是不是被吓到了,其实它就是一种能够输入任意长度的数据,通过计算,转换为一个固定长度字符串,这个转换出的字符串被称为哈希值、散列值或信息摘要,可以把它想象为一个数据的数字指纹
一个优秀的哈希算法具有以下几个特征
- 输入相同的数据,无论什么时候计算出的哈希值都必须是完全相同的
- 输入数据哪怕仅发生极其微小的变化,哪怕是1个bit,输出的哈希值都会发生巨大变化,不可预测的改变
- 无法从哈希值反向推导出原始数据,也就是单向性
- 几乎不可能找到两个不同的输入具有相同的哈希值
数字签名
数字签名的作用就是让别人相信内容没有被改过和确实是来自指定的人,同时签名者也无法抵赖说不是自己签的名
有了哈希算法和非对称加密我们就能够实现数字签名了
其实数字签名的流程很简单,可以分为以下几步
- 对需要签名的数据进行哈希运算,计算数据的哈希值
- 使用私钥对哈希值进行加密
使用数字签名也很简单,进行确认签名的流程叫做验签,可以分为以下几步
- 从数据中提取签名数据和内容
- 使用公钥对签名数据进行解密得到哈希值
- 使用相同的哈希算法计算内容的哈希值
- 对比计算出的哈希值和解密出的哈希值是否一致,一致代表验签成功
数字证书
刚刚说了数字签名,那就有一个问题,验签时使用了公钥,我又如何知道我所获得的公钥是正确的呢?这就是所谓的CA体系
数字证书也称为公钥证书,是一个电子文档,它遵循国际标准(X.509),这个问的那个就像是一个数字世界的身份证一样。
它的核心作用就是将一个公钥与一个特定的实体(个人、组织)的身份信息绑定在一起,并由一个可信的第三方机构对这个绑定关系进行担保和签名
比如用驾照来类比数字证书:
| 要素 | 驾照 | 数字证书 |
|---|---|---|
| 持有者信息 | 姓名、地址、身份证号 | 主题:持有者的名称、组织信息等 |
| 核心凭证 | 驾照号码 | 公钥:证书持有者的公钥 |
| 颁发机构 | 车管所 | 证书颁发机构 |
| 机构印章 | 车管所的官方盖章 | 颁发者的数字签名:CA用自己的私钥对证书内容进行签名 |
| 有效期 | 签发日期和到期时间 | 证书生效和失效的时间 |
你相信驾照上的信息,是因为你信任车管所这个权威机构,并且驾照上有它的防伪签名和印章。
同样,你相信一个数字证书里的公钥属于某个人或组织是因为你信任证书的颁发机构,并且证书上有颁发机构的数字签名
总结来说就是:假如我要将我的公钥发送给对方,那我就找证书颁发机构,提供我的公钥,让证书颁发机构帮我进行签名并制作证书,然后我将制作好的证书发送给对方。
对方拿到我的证书后需要进行验签,确认证书的颁发机构,那我们凭什么就要信任颁发机构呢?答案就是不相 信,颁发机构又会有它的证书,颁发机构的证书是由更上层的颁发机构颁发的,而更上层的颁发机构又有更更上层的颁发机构颁发,这套体系叫做CA体系,这套证书叫做证书链,一直到最上层是根证书,根证书仅有几个企业可以办法,这些跟证书已经早早的保存在我们的设备中了,只需要进行一下确认就可以了
安全问题
好了签名和证书已经为大家介绍完了,大家是不是已经觉的我们的程序只要使用了这套签名和证书体系就很安全了呢?哈哈哈,别太自信,你想想如果有人通过逆向的手段,直接修改我们的程序,绕过了验签流程,那再安全的方案也没有用啊
那怎么办呢?
程序加壳保护
现在我们已经有了足够安全的保障体系了,那要防止的也就是我们的程序被其他人逆向分析或篡改,这时可以使用Virbox Protector工具,对我们的程序进行加壳保护,加壳时会使用混淆,虚拟化,反调试等各种手段保护我们的程序,程序经过保护后我们就不需要在为此担心啦