哈希算法
哈希函数,又称散列算法,是一种从任何一种数据中创建数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。
NEO系统中主要会用到2种不同的散列函数:SHA256和RIPEMD160。前者用于生成较长的散列值(32字节),而后者用于生成较短的散列值(20字节)。通常生成一个对象的散列值时,会运用两次散列函数,例如要生成区块或交易的散列时,会计算两次SHA256;生成合约地址时,会先计算脚本的SHA256散列,然后再计算上一个散列的RIPEMD160散列。
此外,区块中还会用到一种散列树的结构(Merkle Tree),它将每一笔交易的散列两两相接后再计算一次散列,并重复以上过程直到只剩下一个根散列(Merkle Root)。
#
RIPEMD160RIPEMD是一种加密哈希函数,由鲁汶大学Hans Dobbertin, Antoon Bosselaers和Bart Prenee组成的COSIC研究小组发布于1996年。
RIPEMD160是基于RIPEMD改进的160位元版本,会产生一个160bit长的哈希值(可用16进制字符串表示)。其能表现出理想的雪崩效应(例如将d改成c,即微小的变化就能产生一个完全不同的哈希值)。
NEO使用RIPEMD160来生成合约脚本160bit的哈希值。
Example:
字符串 | 哈希值 |
---|---|
hello world | 98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f |
应用场景:
生成合约的哈希
#
SHA256SHA256是SHA-2下细分出的一种算法。SHA-2:一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。SHA-2下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值(可用16进制字符串表示)。
Example:
字符串 | 哈希值 |
---|---|
Hello World | a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e |
应用场景:
计算合约的哈希
签名和确认签名
Base58Check编解码
db3、NEP6钱包的密钥的存储、导出、验证
#
Murmur32Murmur是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域。与其它流行的哈希函数相比,对于规律性较强的key,Murmur的随机分布特征表现更良好。
其特点是:
碰撞率低
计算速度快
擅长大文件的哈希
Example:
字符串 | 哈希值 |
---|---|
Hello World | ce837619 |
应用场景:
布隆过滤器
leveldb存储
#
ScryptScrypt算法是基于PBKDF2-HMAC-SHA-256算法之上的安全加密算法。由著名的FreeBSD黑客Colin Percival为他的备份服务Tarsnap开发的,当初的设计是为了降低CPU负荷,尽量少的依赖cpu计算,利用CPU闲置时间进行计算,因此Scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。
NEO中主要使用Scrypt算法来生成满足NEP-2规范的加密型密钥,使用的参数为:
N: CPU/内存消耗指数,一般取值为2的若干次方, 默认值为:16384
p: 并行计算参数,理论上取值范围为1-255,值越大越依赖于并发计算, 默认值为:8
r:表块大小,理论取值范围为1-255,同样越大越依赖内存与带宽,默认值为:8
Example:
数据 | 参数 | 哈希值 |
---|---|---|
Hello World | key:"I love code" N:16384 p:8 r:8 | 17b94895fab004e035b3630a718b498f6 647458351f04b84b4a2c0bf1db963630fa 7bfd1c29663c7bf3556fd7ba6131e5ddfd6 40b9f6a2a9ad75d3d59b65f932 |
note
上面的哈希值因为太长而成为多行,实际数据是连接的。
应用场景:
NEP2格式密钥的导出。
NEP6钱包的密码效验。
更多信息,请参考https://en.wikipedia.org/wiki/Scrypt。