区块链系统:签名

2023-11-13

        签名算法是使用私钥签名,公钥验证的方法,对一个消息的真伪进行确认。如果一个人持有私钥,他就可以使用私钥对任意的消息进行签名,即通过私钥sk对消息message进行签名,得到signature

signature = sign(message, sk);

        签名的目的是为了证明,该消息确实是由持有私钥sk的人发出的,任何其他人都可以对签名进行验证。验证方法是,由私钥持有人公开对应的公钥pk,其他人用公钥pk对消息message和签名signature进行验证:

isValid = verify(message, signature, pk);

这里是要把message一起发送给验证者,验证者用公钥pk解密signature,如何解密的结果与message相等,则验证通过。

如果验证通过,则可以证明该消息确实是由持有私钥sk的人发出的,并且未经过篡改。

数字签名算法在电子商务、在线支付这些领域有非常重要的作用,因为它能通过密码学理论证明:

  1. 签名不可伪造,因为私钥只有签名人自己知道,所以其他人无法伪造签名;
  2. 消息不可篡改,如果原始消息被人篡改了,对签名进行验证将失败;
  3. 签名不可抵赖,如果对签名进行验证通过了,签名人不能抵赖自己曾经发过这一条消息。

简单地说来,数字签名可以防伪造,防篡改,防抵赖。

        对消息进行签名,实际上是对消息的哈希进行签名,这样可以使任意长度的消息在签名前先转换为固定长度的哈希数据。对哈希进行签名相当于保证了原始消息的不可伪造性。

        我们来看看使用ECDSA如何通过私钥对消息进行签名。关键代码是通过sign()方法签名,并获取一个ECSignature对象表示签名:

const bitcoin = require('bitcoinjs-lib');

let
message = 'a secret message!', // 原始消息
hash = bitcoin.crypto.sha256(message), // 消息哈希
wif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617',
keyPair = bitcoin.ECPair.fromWIF(wif);
// 用私钥签名:
let signature = keyPair.sign(hash).toDER(); // ECSignature对象
// 打印签名:
console.log('signature = ' + signature.toString('hex'));
// 打印公钥以便验证签名:
console.log('public key = ' + keyPair.getPublicKeyBuffer().toString('hex'));

 ECSignature对象可序列化为十六进制表示的字符串。

        在获得签名、原始消息和公钥的基础上,可以对签名进行验证。验证签名需要先构造一个不含私钥的ECPair,然后调用verify()方法验证签名:

const bitcoin = require('bitcoinjs-lib');

let signAsStr = '304402205d0b6e817e01e22ba6ab19c0'
+ 'ab9cdbb2dbcd0612c5b8f990431dd063'
+ '4f5a96530220188b989017ee7e830de5'
+ '81d4e0d46aa36bbe79537774d56cbe41'
+ '993b3fd66686'

let
signAsBuffer = Buffer.from(signAsStr, 'hex'),
signature = bitcoin.ECSignature.fromDER(signAsBuffer), // ECSignature对象
message = 'a secret message!', // 原始消息
hash = bitcoin.crypto.sha256(message), // 消息哈希
pubKeyAsStr = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c',
pubKeyAsBuffer = Buffer.from(pubKeyAsStr, 'hex'),
pubKeyOnly = bitcoin.ECPair.fromPublicKeyBuffer(pubKeyAsBuffer); // 从public key构造ECPair

// 验证签名:
let result = pubKeyOnly.verify(hash, signature);
console.log('Verify result: ' + result);

注意上述代码只引入了公钥,并没有引入私钥。

修改signAsStrmessagepubKeyAsStr的任意一个变量的任意一个字节,再尝试验证签名,看看是否通过。

比特币对交易数据进行签名和对消息进行签名的原理是一样的,只是格式更加复杂。对交易签名确保了只有持有私钥的人才能够花费对应地址的资金。

小结

通过私钥可以对消息进行签名,签名可以保证消息防伪造,防篡改,防抵赖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链系统:签名 的相关文章

  • 交叉编译工具链(arm-linux-gcc)使用测试

    在使用之前 需要先安装交叉编译工具链 arm linux gcc 这里仅提供一个参考链接 不作叙述 参考链接 1条消息 Ubuntu 18 04安装arm linux gcc交叉编译器 超简单 附安装包下载地址 安装交叉编译器 难搞哦 的博

随机推荐

  • mysql sync_binlog 作用_mysql 中 sync_binlog 参数作用

    sync binlog 这个参数是对于MySQL系统来说是至关重要的 他不仅影响到Binlog对MySQL所带来的性能损耗 而且还影响到MySQL中数据的完整性 对于 sync binlog 参数的各种设置的说明如下 sync binlog
  • Slow Changing Dimension

    Type 4 Mini Dimension 解决维度中的某些属性变化频繁的问题 例如Cusotmer中的年龄 收入 购买频率等属性 优点 1 节省存储空间 2 不需要频繁的对维度的属性进行更改 实例 摘自Kimball的书 Note 在插入
  • 【对象存储】那些事

    最近在某个项目中使用了对象存储 以前看过一个新闻 某公司的对象存储被盗刷 一夜之间账户欠费几十万 我们这点小买卖可经不起这么折腾 所以下功夫研究了下 防患于未然 说到防盗刷 我们还得了解对象存储是如何计费的 本文针对这2个问题进行阐述 对象
  • 前端常用的优化技巧

    前端优化 前端的性能优化是比较重要的一个版块内容 适当的优化可以提升网站的性能 而前端优化有很多方面 我们来慢慢了解 但是不是所有的优化都是适合你当前的项目的 看你项目的需求 来选择适合的方法 调试工具 我们经常使用的就是浏览器的控制台来查
  • B站小甲鱼python学习笔记

    000 愉快的开始 视频地址 https www bilibili com video BV1xs411Q799 p 1 python跨平台 应用范围 操作系统 WEB 3D动画 企业应用 云计算 大家可以学到什么 Python3的所有常用
  • 找最大最小整数(python3)

    问题描述 编写一个程序 用户输入若干整数 试找出其中的最大数和最小数 输入形式 用户在第一行待输入数据个数 在第二行输入数据 输出形式 程序在下一行输出数据的最大值和最小值 样例输入 5 89 62 96 74 52 样例输出 96 52
  • 在SpringBoot项目中添加logback的MDC

    先看下MDC是什么 Mapped Diagnostic Context 用于打LOG时跟踪一个 会话 一个 事务 举例 有一个web controller 在同一时间可能收到来自多个客户端的请求 如果一个请求发生了错误 我们要跟踪这个请求从
  • Visual Studio Code 快捷键汇总

    Visual Studio Code 快捷键汇总 按ctrl shift p 然后输入 keyboard 然后选择用户快捷键文件 将键绑定放在此文件中以覆盖默认值 key ctrl y command editor action delet
  • Nginx 安装

    文章目录 安装 openresty 编译 nginx 开始编译 附录 源代码目录结构说明 编译目标 prefix 目录结构 安装 https nginx org 官网 CHANGES 查看版本的修改 2015 年发布版本 支持了 Strea
  • 解决keil文件用vscode打开乱码

    打开用户设置 输入encoding 勾选Auto Guess Encoding 如图 就可以自动识别文件的编码了 这样打开GBK和UTF8编码的带中文的文件 就不用手动切换编码了 在vscode文件中可以设置自动保存 你就不用手动ctrl
  • SpringBoot系列之二 关于JSON使用的那点事儿

    一 使用JSON 1 使用SpringBoot 中的Controller如果返回对象 返回到前端的数据默认为JSON RequestMapping getPerson public Person getPerson Person perso
  • Oracle跨库访问DBLINK

    1 DBLINK的介绍 Oracle在进行跨库访问时 可以创建DBLINK实现 比如要将UAT的表数据灌入开发环境 则可以使用UAT库为数据源 通过DBLINK实现将查出的数据灌入开发库 简而言之就是在当前数据库中访问另一个数据库中的表中的
  • python的后端库_【后端开发】python库是什么

    初学python的小伙伴一定遇到这样一个问题 python模块 python包 python库 感觉被绕晕了 今天说一说python中的模块 库 包有什么区别 1 python模块是 python模块 包含并且有组织的代码片段为模块 表现形
  • 2014年终总结——-我的匆匆这一年(面试,毕业季,工作)

    看看自己上一次写博客的时间 到现在已经快有一年了 这一年自己毕业 走上社会 感悟人生 当自己意识到该写今年的年终总结的时候 却发现不知道该从什么地方开始写 该写些什么了 还好 这一年让自己懂得不管什么事 如果已经发生 自己首先最不应该想的就
  • 空间点到直线垂足坐标的解算及C++实现

    假设空间某点O的坐标为 Xo Yo Zo 空间某条直线上两点A和B的坐标为 X1 Y1 Z1 X2 Y2 Z2 设点O在直线AB上的垂足为点N 坐标为 Xn Yn Zn 点N坐标解算过程如下 首先求出下列向量 由向量垂直关系 上式记为 1
  • STM32-USB之Buffer Description Table

    一 stm32的USB接口每个端点对应两个分组缓冲区 其地址与范围位于分组存储区 从STM32的数据手册中存储器映像 gt 寄存器组起始地址看到 注意地址范围大小为1024 APB1按32BIT对齐访问 但此SRAM是由256个16BIT字
  • gitlab CI/CD :创建一个复杂的pipeline流水线

    教程内容原文地址 Tutorial Create a complex pipeline 当前教程版本 16 1 文章目录 先决条件 创建一个项目来保存 Docusaurus 文件 创建初始CI CD的配置文件 添加一个job来构建站点 添加
  • msvcr110.dll丢失的解决方法?有哪些修复的方法?

    msvcr110 dll丢失要怎么办 相信很多人都遇到过这个dll文件丢失问题吧 突然电脑就弹出一个框框显示无法启动程序 那么遇到这种问题我们需要怎么去解决 有没有用什么好的方法推荐 下面我们一起来看看msvcr110 dll丢失的解决方法
  • G++ 编译选项(自用)

    fPIC 使用相对地址加载共享库 rdynamic 将所有链接库符号 添加到动态符号表 Wno unused variable 未使用变量不报警 Werror return type 有返回值的函数 不写return 报错 Wno depr
  • 区块链系统:签名

    签名算法是使用私钥签名 公钥验证的方法 对一个消息的真伪进行确认 如果一个人持有私钥 他就可以使用私钥对任意的消息进行签名 即通过私钥sk对消息message进行签名 得到signature signature sign message s