数字签名(digital signature)技术介绍

本文主要介绍数字签名(digital signature)技术的相关知识。

1 概述

1.1 What

数字签名(又称公钥数字签名、电子签章),是一种类似写在纸上的、普通的物理签名,只不过数字签名通过公钥加密领域的技术实现。数字签名属于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算:一个运算用于签名,另一个运算用于验证签名(验签)。

数字签名,就是只有信息的发送者才能产生的、别人无法伪造的一段数字串,这段数字串是对信息发送者所发送信息真实性的一个有效证明。

数字签名是非对称密钥加密技术数字摘要技术的应用。

数字签名文件的完整性是很容易验证的(不需要骑缝章、骑缝签名,也不需要笔迹专家),而且数字签名具有不可抵赖性(不需要笔迹专家来验证)。

简单地说,所谓数字签名,就是附加在数据单元上的一些数据,或者是对数据单元所做的密码变换,通过使用这些数据或变换,数据单元的接收者能够确认数据单元的来源、数据单元的完整性,并且(这些数据或变换)保护数据、防止被人(例如接收者)进行伪造。

数字签名是对电子形式的消息进行签名的一种方法,一个签名消息能在通信网络中传输。

尽管基于公钥密码体制和私钥密码体制都可以获得数字签名,不过目前主要是基于公钥密码体制的数字签名。

1.2 应用场景

数字签名技术的应用场景较多,在此介绍一种常见的应用场景。

通过使用数字签名技术,将摘要信息(数字摘要是将任意长度的消息变成固定长度的短消息,这里描述的是对原文使用HASH函数生成的一个摘要信息)使用发送者的私钥加密,与原文一起发送给接收者。接收者通过发送者的公钥解开被加密的摘要信息,同时使用HASH函数对收到的原文生成一个摘要信息,然后对比这两份摘要信息:如果对比结果相同,则说明收到的信息是完整的,即信息在传输过程中没有被修改;否则,说明信息被修改过。这就是通过数字签名技术验证信息的完整性的典型应用场景。

数字签名是个加密的过程,数字签名验证(验签)是个解密的过程。

1.3 作用

数字签名的作用是:保证信息传输的完整性、进行信息发送者的身份认证、防止交易中的抵赖发生。

2 示例

继承另一篇非对称加密算法文章:为了确保通信中的一方得到的公钥K2确实是通信另一方发布的公钥K2(而不是中间人mim伪造的公钥K2),数字签名技术应运而生。

下面通过示例演示,介绍数字签名的相关知识。

2.1 使用数字签名生成CRT

生成CRT(CA signed certificate)的过程如下:

1. 小红把自己的公钥K2和ID(身份证号码,或者域名)合成为身份证申请(certificate signing request, CSR),如下:

小红的CSR = 小红公钥K2 + 小红域名

2. 小红把自己的CSR发给一个德高望重的人(称为CA,即certificate authority),比如小亮;

3. 小亮用自己的私钥K1加密小红的CSR,得到的密文被称为数字签名(digital signature,下面简称signature),如下:

小亮的signature = E(小红的CSR, 小亮的私钥K1)

4. 小亮把signature和小红的CSR的明文合在一起,称作经过CA签署的身份证(CA signed certificate, CRT),发给小红,成为了小红的CRT,如下:

小红的CRT = 小红的CSR + 小亮的signature

说明:单纯的CSR都是明文的,因为CSR只是公钥和ID的组合。

2.2 根据数字签名进行认证

在上面生成了小红的CRT后,如果小明要与小红聊天,过程如下:

1. 小明想要与小红聊天(建立HTTPS连接)时,小红出示了自己的CRT,该CRT是经过小亮(CA)签署的; 

2. 小明拿到了小红的CRT后,看到了这个CRT是经过小亮签署的,因为小亮很权威,小明是相信小亮的(小明预先在自己的机器上安装了小亮的身份证CRT。这里小亮的身份证CRT是小亮对外公布的,其实是一个自签名的CRT);

3. 小明从小亮的身份证CRT中获取小亮的CSR,再从小亮的CSR中提取小亮的公钥K2。如下:

小亮的公钥K2 = 小亮的CRT中的CSR(明文)中的公钥K2

4. 小明用提取的小亮的公钥K2,解密小红CRT中小亮的signature,得到了小红的CSR'。如下:

小红的CSR' = D(CRT中小亮的signature, 小亮的公钥K2)

5. 如果第4步中得到的这个小红的CSR'和小红CRT中的CSR(明文)一致,则说明“这个小红的CRT是经过小亮确认过并且签名的,所以这个小红的CRT是可信的”。如下:

if 小红的CSR' == 小红的CRT中的小红的CSR(明文)
    小红的CRT可信

6. 所以,既然小红的CRT是可信的,小明就可以获取小红CRT中的CSR中的小红的公钥K2,进行后续通信了。

2.3 Who is CA

从上述过程中可以看出,任何人或机构都可以作为CA,只要他愿意公开自己的公钥K2(通过自签名、提供自己的CRT的方式),那么他就可以用自己的私钥去加密别人的CSR(从而生成signature),签署生成别人的CRT。

如果CA不可靠,那就没有办法了,很多操作系统(Windows、Mac OS X)和浏览器(Chrome、Firefox、IE)会内置一些可靠的CA的身份证,我们可以从这些可靠的CA的身份证中获取该CA的公钥K2,如果后面遇到了该CA签署的别人的身份证,那么就可以通过该CA的公钥K2验证那个人的身份证是否可信了。

2.4 信任链

在上文中,CA小亮如果担心没人相信自己是个权威的CA,那么可以找一个大家都相信的CA(比如老王),然后让老王对小亮的CRT进行签名,如下:

小亮的CSR = 小亮的公钥K2 + 小亮的域名
老王的signature = E(小亮的CSR, 老王的私钥K1)
小亮的CRT = 小亮的CSR(明文) + 老王的signature

经过上述步骤后,如果浏览器或者操作系统中安装了老王的身份证CRT,那么我们就可以从中获取老王的公钥K2,从而验证“小亮的身份证CRT是老王确认并且签名过的”。

此时,小亮在签署小红的CRT时,可以在小红的CRT后面附上小亮的CRT,这样小红的CRT就有“两页”了。

当小明和小红通信时,过程如下:

1. 小红出示自己的CRT,该CRT是经过小亮认证的,而小亮的CRT又是经过老王认证的;

2. 小明虽然不信任小亮,但是因为信任老王,所以小明先用老王的公钥K2来验证小红CRT中附带的小亮的CRT;

3. 经过验证,小明信任了小亮;

4. 然后,小明再用小亮的公钥K2来验证小红的CRT;

5. 最终,小明信任了小红。

要是怕小明连自己也不信任,老王可以再找一个小明信任的人来签名自己的身份证。这个过程可以不断递推,从而形成一条信任链(trust of chain)。

2.5 根CA和自签名

前面介绍了信任链,不过信任链总会有个顶端,即最后一个签名者(CA),这个最后的签名者被称为根CA(root CA)。

根CA对应的CRT称为根身份证,根身份证是由根CA自己签名的。

实际上,我们每个人都可以自己签名认证自己的身份证,得到自签名的身份证(self-signed certificate)。生成自签名身份证的过程如下:

  1. 生成一对秘钥:公钥K2和私钥K1;
  2. 创建自己的CSR;
  3. 用自己的秘钥K1加密CSR,得到signature;
  4. 最后,把自己的CSR(明文)和signature一起发布,生成自己的CRT。

任何人,只要相信我们的自签名CRT,就可以用我们的CRT中的CSR中的公钥K2加密传送给我们的信息,然后我们就可以通过私钥K1来解密。

在2.4节的示例中,如果老王是根CA,那么身份证信任链如下:

【小红的CRT】

小红的CSR = 小红公钥K2 + 小红域名
小亮的signature = E(小红的CSR, 小亮的私钥K1)
小红的CRT = 小红的CSR(明文) + 小亮的signature

【小亮的CRT】

小亮的CSR = 小亮的公钥K2 + 小亮域名
老王的signature = E(小亮的CSR, 老王的私钥K1)
小亮的CRT = 小亮的CSR(明文) + 老王的signature

【老王的CRT】

老王的CSR = 老王的公钥K2 + 老王的域名
老王的signature = E(老王的CSR, 老王自己的私钥K1)   --- 根CA,自签名
老王的CRT = 老王的CSR(明文) + 老王的signature

### Java 开发中常用的 Linux 命令汇总 在 Java Web 开发过程中,Linux 是一种非常重要的操作系统环境。掌握一些常见的 Linux 命令对于提高开发效率至关重要[^1]。以下是 Java 开发者经常使用的 Linux 命令分类及其功能: #### 文件操作类命令 - **`ls`**: 列出当前目录下的文件和子目录列表。 示例:查看详细信息 `ls -l` 或按时间排序 `ls -lt`。 - **`cd`**: 改变工作目录到指定路径。 示例:进入 `/home/user` 目录 `cd /home/user`。 - **`pwd`**: 显示当前所在的工作目录路径。 - **`cp`**: 复制文件或目录。 示例:复制文件 `cp source.txt destination.txt`。 - **`mv`**: 移动或重命名文件。 示例:移动文件 `mv file.txt /new/path/file.txt`。 #### 文本处理类命令 - **`cat`**: 查看、创建或连接文件的内容并输出到标准输出设备上。 示例:显示文件内容 `cat filename.txt`。 - **`grep`**: 在文件中搜索特定字符串,并返回匹配的结果。 示例:查找包含关键词的行 `grep "keyword" filename.txt`。 - **`sed`**: 流编辑器,可以用来执行基本的文本转换。 示例:替换文件中的字符串 `sed 's/old/new/g' inputfile > outputfile`。 - **`awk`**: 强大的文本分析工具,适合复杂的文本数据提取和报告生成。 #### 系统管理类命令 - **`ps`**: 显示当前系统的进程状态。 示例:查看所有进程 `ps aux`。 - **`top`**: 实时动态监控系统运行情况以及资源消耗状况。 - **`kill`**: 终止某个正在运行的进程。 示例:终止 PID 为 1234 的进程 `kill 1234`。 - **`df`**: 报告磁盘空间使用情况。 示例:以人类可读的方式展示 `df -h`。 - **`du`**: 计算目录所占的空间大小。 示例:统计某目录下各文件夹占用量 `du -sh *`。 #### 权限设置类命令 - **`chmod`**: 修改文件或者目录访问权限。 示例:赋予脚本执行权 `chmod +x script.sh`。 - **`chown`**: 更改文件所属用户及组别归属关系。 示例:更改所有权给 userA 用户 `chown userA file.txt`。 #### 网络配置类命令 - **`ifconfig`** (部分发行版已弃用): 配置网络接口参数;可以用 `ip addr show` 替代它来获取网卡信息。 - **`ping`**: 测试主机之间连通性和延迟性能指标。 - **`netstat`**: 展示网络连接、路由表等相关统计数据;也可以通过更现代版本如 ss 工具代替之。 - **`ssh`**: 安全远程登录其他计算机上的 shell 并传输加密后的指令流。 #### 缓存清理相关命令 由于缓冲区的存在可能影响实际可用内存数值观察,在排查问题时常需注意清除缓存的影响因素之一即 pagecache/dentries/inodes 数据结构等内容,则有如下方法可供参考: - 手动释放页面高速缓存(Page Cache)、dentry 和 inode 缓冲区可以通过向 procfs 特殊虚拟文件写入对应数字实现清零效果[^4]: ```bash sync && echo 3 | sudo tee /proc/sys/vm/drop_caches ``` 以上这些只是基础的一部分常用命令集合,具体场景还需要根据项目需求灵活运用更多高级技巧[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liitdar

赠人玫瑰,手有余香,君与吾共勉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值