Vite安全算法相关技术选型
123458224
发表于 2023-1-10 04:23:36
89
0
0
数字签名算法 - Ed25519* O+ T G7 g% U7 r8 @+ T
, F+ B7 W- y( B
一、背景
- V3 r( @, G8 _6 N
数字签名的目的是创造和我们合同上签字一样的不可抵赖性,其核心属性是:通过签名的消息可以明确知道其发起人,因为只有唯一的签名者的私钥才能计算出有效的签名,这也就意味着该消息确实是签名方生成的,这种证明在一些国家具有法律上的意义,比如美国的电子签名法案,德国的签名法等。4 y1 r8 Y; K; U6 p, B. U$ M. i2 _
私钥签名,然后公布公钥、消息和签名数据让大家去验证,在这些步骤中公私钥对扮演着最重要的角色,它们总是成对出现,而且就像量子纠缠一样互不分离。公私钥一般是通过一个特殊的单向函数和一个随机数生成,这种单向函数往往正向求解( f(x) = y) 是多项式难度,而逆向求解( f-1(y) = x)是指数级难度。' `0 h: y# `, A- f6 G- N
假设x是私钥,y是公钥,那么从私钥推导出公钥在现代计算机体系上需要大到没有任何单位能承受的消耗,所以在目前来看是非常安全的,但是如果量子计算机在未来真的能研究出来的话,那么现在这些广泛基于RSA,DLP(离散对数问题),和从DL上扩展来的ECC(椭圆曲线密码学)的非对称加密机制都是不安全的,如何做到quantum safe,这大约是个和研究量子计算机一样漫长的岁月。
签名算法在区块链系统中处于最基础的位置,账户地址、交易的产生都与之紧密相关,所以在签名算法的选择上,我们必须兼顾安全和性能,其中安全是首要的,中本聪当时选择的是ECDSA over secp256k1,secp256k1是SECG定义的一个Koblitz曲线,在他使用前几乎无人问津,它设计透明,而不像NIST选中的secp256r1(也就是现在主流常用的P256)曲线中有一些诡异的参数,这些参数被广泛地认为是NSA植入的后门,后来的一系列事件也确实证明了中本聪的选择是非常具有前瞻性的,于是以太坊、EOS等也都跟进了中本聪的想法,但是随着Ed25519专利期限制解除,包括比特币的核心开发者们和Vitalik Buterin都讨论过是否迁移到Ed25519,链接中可见他们的态度都比较暧昧地倾向于使用Ed25519,但可能由于迁移成本太大所以未能成行,而ripple则是在14年就果断迁移了过去。0 ?8 D4 F4 O' ?4 [# D
# x; T+ n' p! h
参考链接:9 ^$ T$ E* |" d" n3 \6 z0 z
https://www.ams.org/notices/201402/rnoti-p190.pdf& q2 C$ X$ f/ d) b8 m, s% G
https://bitcointalk.org/index.ph ... g1134832#msg11348328 q( ]& I9 ]# Q( Q C
! Q: p( m5 M h$ b
https://blog.ethereum.org/2015/07/05/on-abstraction/$ {. f- }9 _& }) ~7 a
: a( l+ W7 {7 l
二、安全性考量
Ed25519在安全性上经过大量独立的知名安全专家评测后被认为是"safe",而secp256k1是"unsafe"。# ^- \5 L( S* v: k; a
# ?$ n' x0 Q. h' e
参考链接:# j+ X2 C3 f, ]
* n4 V l& R2 ]% k r! `
https://safecurves.cr.yp.to/3 [0 m5 h, W! S# j5 X7 K
* E- @3 j" R9 B
三、性能考量
Vite为了满足了工业级应用对高吞吐、低延迟和扩展性的要求,设计了许多优化的方案,比如提出了"交易分解"这个概念,其含义是会把一个交易拆成类似于"请求"和"响应"这样的一对交易,那么再结合我们如此高的TPS,可以预见在Vite的公链系统中对交易的验证和确认是非常频繁发生的,也就是说整体系统的性能表现对签名和验签算法的速度高低会相当敏感。
; C/ U& `* Z" c) J. k- H+ f
根据现在的数据Ed25519的性能数倍快于ECDSA over secp256k1 (参考ripple的benchmark),我相信这对我们系统的性能提升会带来很大的帮助。不仅如此,Ed25519的签名长度也略小于ECDSA,这给就网络传输和存储系统减轻了不小的压力。2 \* a" {9 K6 W5 ?4 O) y) U1 U- q
参考链接:
4 e. T7 }8 s) M1 l. n' C N" m
https://ripple.com/dev-blog/curves-with-a-twist/
https://bench.cr.yp.to/primitives-sign.html0 n# @# [; z& n, z
四、改造: {6 h3 L4 x0 h/ h$ X1 E
" B% `9 C! M& P' G$ P+ F2 \1 N3 j* G
我们把标准Ed25519的SHA2替换成了Blake2b。2 O# ~7 ] A9 Y1 `! W6 R
五、不足8 A. ?8 u: P1 m% K
由于密钥空间是非线性的,无法兼容BIP的Hierarchical Deterministic Key Derivation。
+ a3 W6 z/ j- C* {- F2 y
参考链接:
https://cardanolaunch.com/assets/Ed25519_BIP.pdf
; g7 s1 k7 H6 ]$ B. \% d
2! Z. U! T' c) j1 V, A( L
Hash算法 - Blake2b
3 X' f7 W# z% [; Y
一、背景: _- |% k$ C7 B; Z5 Q' V
哈希算法的作用是对一串任意长的消息生成一个短的固定长的摘要,Hash函数也是一个单向函数,但是和非对称加密系统中的单向函数的差别在于,后者的单向函数往往是追求反向求解在实际操作上不可能,但理论上是可能的,或者换句话说公钥含有推导出私钥的完整信息。但是哈希函数则不一样它理论上不能逆向,而实际上却往往可以,理论上来说,一个哈希值可以有无穷多个原像对应它,给一个简单的证明,假设一个哈希函数的输出是n个bit,那么这个Hash函数的所有输出值只有2n 个,而输入是无限制的。
$ K$ Y* X/ |3 V; j
那么根据鸽巢原理,如果输入是m * 2n个bit,每一个Hash的输出至少对应m个原像,那么即使 Hash(X1) = Hash(X2)= Y,也没法得到X1=X2的结论。但实际上受限于存储和计算能力,输入的原文的长度不会很大,意味着m的值域很小,所以一旦有一个X满足Hash(X) = Target,X是真实原像的概率非常大。
参考链接:4 y/ q; J9 v* B1 W0 X- u
# c: F* I+ z; a z. t% a0 b# D6 A
https://blake2.net/# Y" l/ T2 ] m, R7 c: g0 s
0 s1 ]- J3 c6 P7 ?, L7 V
Hash函数在我们的系统中,担负着挖矿,数据的防篡改等功能,它和签名算法一样是最基础的组件,所以同样我们在技术选型的时候要着重考量其安全和性能。
二、安全性考量
$ b% S4 L `( R( b0 B" G0 G
Blake2的前身是Blake,Blake和keccak当时一起竞争SHA3标准的时候失利了,当时失利的原因是Blake和sha2的实现有点相似,而NIST的目标是一个完全不同于SHA2标准的Hash算法。
“desire for SHA-3 to complement the existing SHA-2 algorithms … BLAKE is rather similar to SHA-2.”7 l# z1 r- y( l+ K5 C' x& v
8 }* X$ p" c( K( D
事实上在安全性评估上NIST给了Blake相当高的评价,其 report形容Blake。: t* {( k6 `2 D
! K- i' K& {/ `0 g* v2 }
参考链接:8 b, L D' [# e' E: ~
: a: Y+ }. _; j$ M) H+ f) W6 C
https://nvlpubs.nist.gov/nistpubs/ir/2012/NIST.IR.7896.pdf2 {3 h! X: S( Y! Y
“BLAKE and Keccak have very large security margins.”
所以一般而言我们可以认为blake2的安全性和keccak不会有大的区别。8 B3 ?- z/ z$ g
三、性能考量0 H, y o; R& H4 r% n& j
根据大量的数据Blake2的性能表现在现代的通用CPU(X86 ARM等)上的表现远远领先其它任何Hash算法。
具体性能表现参考链接: _4 x% r0 G0 S9 o/ h( F" j
: A: D( e6 g3 G/ b3 |6 P
http://bench.cr.yp.to/results-sha3.html
Blake2的另一个特点是用ASIC设计的Blake2算法能达到的峰值并不会很高,这就意味着挖矿的峰值速率相对较低,这也是我们希望的。' e' u4 y% M+ \, G* s f. b
3
$ [9 W& b# O3 }, P4 q1 \% A
密钥派生函数 - scrypt- A- A- ~: r6 p- S
一、背景
密钥派生函数(Key Derivation Function) ,简单而言就是使用一个主密钥派生子密钥的函数,比如把一个短的字符串通过KDF的运算扩展成需要的形式,它和Hash函数很类似,最大不同在于它会引入随机量从而防止黑客进行一些查表攻击等(比如彩虹表 rainbow tables)。我们采用的scrypt是一种内存依赖性的KDF,它每一次计算都要占用大量内存资源,消耗很长时间,所以暴力攻击也几乎是不可能的。5 \$ h2 b8 Q+ f6 M9 l% b
KDF在我们的系统中处于非基础性的地位,我们把用户输入的随机短密码经过KDF之后,转换成256bits的密钥,然后使用这个密钥配合AES-256-GCM算法,加密Ed25519私钥,从而安全地在PC上保存我们的私钥。5 T8 N, L, ?% N
二、选择原因% Y; X# u2 _/ M/ i/ }9 p+ ^$ V6 W
. N2 u8 V! \. J3 ]
从技术角度来看scrypt相比于获得15年的Password Hashing Competition的argon2来说安全性上并没有大的区别,但是由于其诞生更早使用更广泛所以在实践角度看显得更成熟一点,argon2如果再有两到三年年仍然没有被发现大的问题,我们也有可能会使用它。
4
相关名词解释* q) K( A' A5 T# p3 @
1 m1 l& U& \0 m8 A) {& {
ECDSA(Elliptic Curve Digital Signature Algorithm)是使用椭圆曲线的数字签名算法9 t/ r5 S! h& m; v+ j/ l
& ?0 u9 F, ~4 M) t2 ^& p) j
secp256k1是ECDSA算法的一个参数 }( q( g5 Y, O, s/ J
* sec是SECG(Standards for Efficient Cryptography Group)推出的Standards for Efficient Cryptogrpahy
* p的意思是这个椭圆曲线使用 prime field,相对应的/ f: \" d4 `# Z! K/ n; [8 W
& z+ `8 x8 q) J/ g( b) y2 D X
* 256的意思是 prime的长度是256bits
* k 是Koblitz曲线
* 1 意味着它是第一个(事实上也是唯一)标准曲线的类型* a8 [0 g" w- C7 ~
) ?3 f1 ]$ L l5 v
Ed25519 是一个使用SHA512/256和Curve25519的EdDSA签名算法
成为第一个吐槽的人