Show / Hide Table of Contents

哈希算法

哈希函数,又称散列算法,是一种从任何一种数据中创建数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。

NEO系统中主要会用到2种不同的散列函数:SHA256和RIPEMD160。前者用于生成较长的散列值(32字节),而后者用于生成较短的散列值(20字节)。通常生成一个对象的散列值时,会运用两次散列函数,例如要生成区块或交易的散列时,会计算两次SHA256;生成合约地址时,会先计算脚本的SHA256散列,然后再计算上一个散列的RIPEMD160散列。

此外,区块中还会用到一种散列树的结构(Merkle Tree),它将每一笔交易的散列两两相接后再计算一次散列,并重复以上过程直到只剩下一个根散列(Merkle Root)。

RIPEMD160

RIPEMD是一种加密哈希函数,由鲁汶大学Hans Dobbertin, Antoon Bosselaers和Bart Prenee组成的COSIC研究小组发布于1996年。

RIPEMD160是基于RIPEMD改进的160位元版本,会产生一个160bit长的哈希值(可用16进制字符串表示)。其能表现出理想的雪崩效应(例如将d改成c,即微小的变化就能产生一个完全不同的哈希值)。

NEO使用RIPEMD160来生成合约脚本160bit的哈希值。

Example:

字符串哈希值
hello world98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f

应用场景:

生成合约的哈希

SHA256

SHA256是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 Worlda591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

应用场景:

  • 计算合约的哈希

  • 签名和确认签名

  • Base58Check编解码

  • db3、NEP6钱包的密钥的存储、导出、验证

Murmur32

Murmur是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域。与其它流行的哈希函数相比,对于规律性较强的key,Murmur的随机分布特征表现更良好。

其特点是:

  • 碰撞率低

  • 计算速度快

  • 擅长大文件的哈希

Example:

字符串哈希值
Hello Worldce837619

应用场景:

  • 布隆过滤器

  • leveldb存储

Scrypt

Scrypt算法是基于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 Worldkey:"I love code"
N:16384
p:8
r:8
17b94895fab004e035b3630a718b498f6
647458351f04b84b4a2c0bf1db963630fa
7bfd1c29663c7bf3556fd7ba6131e5ddfd6
40b9f6a2a9ad75d3d59b65f932

上面的哈希值因为太长而成为多行,实际数据是连接的。

应用场景:

  • NEP2格式密钥的导出。

  • NEP6钱包的密码效验。

更多信息,请参考 https://en.wikipedia.org/wiki/Scrypt