数字签名技术
2023-02-25 18:22:19 时间
介绍数字签名
数字签名是一种用于确认数据的完整性、确认发送者身份的技术。
签名主要包含两个过程:做摘要、进行非对称加密。
- 做摘要:签名者使用消息摘要算法对消息做摘要;
- 进行非对称加密,得到签名值:签名者使用私钥 privateKey 对摘要进行非对称加密,得到消息的签名值;
- 发送者将 “原始消息” 和 “消息的签名值” 一同发给接收者。
验签主要包含两个过程:对签名值进行解密、自己做摘要,并比较摘要。
- 对签名值进行解密,得到摘要值:验签者使用签名者的公钥 publicKey 对签名值进行解密,得到摘要值。
- 自己做摘要,并比较摘要值:验签者使用消息摘要算法对签名的数据做摘要,然后将 “计算出的摘要值” 和 “解密得到的摘要值” 作比较:如果二者相同,则说明验签成功;否则说明验签失败。
思考:为什么不直接对消息进行签名,而是对消息的摘要值进行签名呢?
“基于消息生成签名” 和 “基于消息的摘要值生成签名” 都可以。考虑到加解密的运算速度是相对缓慢的,数字签名算法建议对消息摘要值进行签名,因为摘要值的长度是固定的,并且一般消息的摘要值的长度要比消息的长度短,加解密的运算速度会比较快。
介绍签名算法
一个签名算法包括两个部分:消息摘要算法、非对称加密算法。
常见的签名算法有:RSA、RSA2。
RSA 签名算法的全称是 SHA1WithRSA:它使用的消息摘要算法是 SHA1,它使用的非对称加密算法是 RSA。RSA 签名算法对 RSA 密钥的长度不限制。推荐使用 2048 位以上(256 字节)
RSA2 签名算法的全称是 SHA256WithRSA:它使用的消息摘要算法是 SHA256,它使用的非对称加密算法是 RSA。RSA2 签名算法强制要求 RSA 密钥的长度至少为 2048 位。
数字签名的作用
数字签名技术的本质不是为了加密。
技术是为了解决问题而生的,进行数字签名的目的是:
- 防止他人篡改信息:由于只有私钥持有者才能 “签署” 消息(不考虑私钥泄露的问题),因此其他人无法篡改信息。如果信息被篡改,那么消息接收者通过验签结果将会得知信息被篡改了。确保信息自签名后 到 收到为止,信息未被修改过。
- 防止他人伪造信息:由于只有私钥持有者才能 “签署” 消息(不考虑私钥泄露的问题),因此其他人无法伪造信息。如果信息被伪造,那么消息接收者通过验签结果将会得知信息是被伪造的。
- 防止签名者抵赖:由于只有私钥持有者才能 “签署” 消息(不考虑私钥泄露的问题),因此私钥拥有者不能抵赖说这条签署消息不是他发送的。
数字签名进行的是非对称加密。
如果数字签名进行的是对称加密的话,那么数字签名将不能防止签名者抵赖。原因就在于消息发送者 和 消息接收者拥有同样的密钥(公钥),所以消息发送方可以抵赖,否认消息是他发送的。
参考资料
数字签名是什么? - 阮一峰的网络日志 (ruanyifeng.com)
《深入浅出 HTTPS 从原理到实战》
相关文章
- zzcms v8.1审计
- Microsoft VBScript 运行时错误 '800a0009' 下标越界: '[number: 1]'的解决方法
- 《上海悠悠接口自动化平台》-4.注册用例集实战演示
- 《上海悠悠接口自动化平台》-5.测试计划与定时任务
- 实验吧WEB部分题解
- 对某个CMS的CSRF挖掘过程分析
- typecho搬家后出现的一些问题解决方法
- 由filter_var()函数引起的技术探讨
- 由PHP SECURITY CALENDAR 2017引发的思考总结
- 精读:REDQUEEN: Fuzzing with Input-to-State Correspondence
- pytest文档82 - 用例收集钩子 pytest_collect_file 的使用
- 精读:CollAFL: Path Sensitive Fuzzing
- pytest文档83 - 把收集的 yaml 文件转 Item 用例并运行
- pytest文档84 - 把收集的 yaml 文件转成pytest 模块和用例
- 精读:Coverage-based greybox fuzzing as markov chain
- 在本地搭建 discourse 社区
- pytest + yaml 框架 - 1.我们发布上线了!
- pytest + yaml 框架 - 2.extract 提取结果与接口之间的参数关联
- pytest + yaml 框架 - 3.全局仅登录一次,添加Authentication token认证
- pytest + yaml 框架 -4.用例参数化parameters功能实现