签名以及身份的管理
1.签名
1.1 特性
- 仅自己可以自己特定的签名,但是别人一看就知道就可以进行验证;
- 与特定文件关联,不能拿着我这个签名去与其他文件关联。
1.2 签名算法过程
1.2.1 总的流程
1.2.2 各个详细的分流程
1.3 签名的不可伪造性以及相关试验
1.3.1 签名的特性以及相关约束
由于需要签名做到不可伪造性那么就需要对相关参数以及函数算法进行一些相关约束,约束如下:
- 我们注意到
g
e
n
e
r
a
t
e
K
e
y
s
generateKeys
generateKeys和
s
i
g
n
sign
sign都可以采用随机算法;
- 并且
g
e
n
e
r
a
t
e
k
e
y
s
generatekeys
generatekeys最好是随机的,因为它需要为不同的人生成不同的密钥;
- 而
v
e
r
i
f
y
verify
verify则需要是确定的。
1.3.2 试验
对于不可伪造性我们可以做一个实验:
-
实验内容:
- 不可伪造性游戏是对手(黑客)和挑战者一起玩这样一个游戏:如果黑客可以在一个之前没有见过的消息上进行签名,那么黑客就赢得这个游戏;反之,如果黑客做不到,挑战者就赢得游戏,从而可以证明这个数字签名方案是不可伪造的。
-
实验图示:
- 大致过程就是黑客向挑战者不断发送信息让其进行签名,黑客不断收集签名信息得到其规律,最终目的做出一个不在刚刚的签名信息范围之内的信息以及签名使得挑战者那里依旧能够确认成功。
- 将允许黑客选择一些文件的签名,不限时长,只要猜测的数量合情
- 合情猜测数量的意思是,我们允许攻击者尝试猜测的次数高达百万,但数量高达
2
80
2^{80}
280 就不行了。
1.4 对实践的考虑以及最终的实现
1.4.1 对实践的考虑
-
对算法的随机性有一定的要求,好的随机性才能保证算法的安全,不然别人很容易就通过统计分析去进行破解,尤其在比特币这样一个公开的系统中;
-
信息大小不断变更,而签名算法由于计算压力对长度是有限的,因为需要是整个信息进行签名,而不像hash可以进行分割,所以一个可行的办法就是:
- 首先对信息进行hash摘要提取;
- 对信息的摘要进行签名,摘要完成了签名也间接地对信息完成了签名,并且hash函数具有碰撞阻力;
-
在区块链中可以对hash指针进行签署,签署了hash指针表示签名了该结点,由于关联性同时也就签署了前面的节点,后面的是之后签署的自然就与当前的无关
- 签名覆盖(或者说保护)整个结构——这不仅仅是哈希指针本身,还包括哈希指针指向的整个区块链。比如,如果签署了区块链末尾的哈希指针,其结果就是你有效地数字签署了整条区块链
1.4.2 签名算法
比特币使用ECDSA算法,而不是标准椭圆曲线“secp256k1”[预计提供128位安全保障,即打破这个算法的难度与执行
2
128
2^{128}
2128对称性密钥运算(如破解哈希函数)一样困难]。虽然这个曲线是公开标准,但除比特币以外鲜有使用,其他使用ECDSA的应用(如安全网络浏览时的TLS [2] 密钥交换)通常都使用更常见的“secp256k1”曲线。这就是比特币的一个古怪之处,因为在比特币系统早期实施中被中本聪选定(参见原版前言),现在已很难改变。
注意:
- 使用ECDSA时,确保随机性良好来源至关重要,因为不良来源将可能导致密钥信息的泄露;
- 仅仅只是在生成签名时使用了不良随机,而你使用的密钥完美无缺,你的个人密钥还是有可能泄露。
1.4.3 签名的参数
个人密钥:256位
公钥(未压缩):512位
公钥(压缩):257位
待签名信息:256位
签名:512位
注意,严格来讲,虽然ECDSA只能签署256位的信息,但这存在问题,因为信息在签署之前总是已经经过哈希压缩,因此,任何大小的信息都能被有效签署。
参考文章
- 解读区块链全套六册.第四章.第四节——签名算法部分