区块链100篇之哈希算法

哈希算法

维基百科的定义:是一种从任何一种数据中创建小的数字“指纹”的方法。简单的说就是将任意的数据通过一个函数转化成一个有着固定长度的数据串,这个数据串就叫哈希值。

一般哈希算法都需要满足以下几个条件:

  • 正向快速;给定一个原文,可以在一定的时间内快速算出hash值;
  • 逆向困难;当知道某一个hash值,没办法算出这个hash值所对应的原文;
  • 输入敏感;只要原文中有稍微的改动,哪怕只是增加了一个标点符号或者一个空格,都会导致得出的结果完全不同;
  • 避免冲突;不同的输入不能产生相同的输出,简单的说就是很难找到两段不同原文的hash值是一样的。

逆向困难以及避免冲突保证了哈希算法的安全性。

哈希算法的主要用途

哈希算法主要是用于对消息的完整性进行验证,举个例子,现在有原文A,对它进行哈希运算得到一个hash值,要验证这个原文是否有被篡改过只需要把内容文件使用相同的哈希算法进行哈希运算,将得出的hash值与原来的hash值进行对比,如果一样则可以判定该内容没有被修改过,这其实是使用到了哈希算法的输入敏感这一特性。

现在很多区块链项目对于存储数据也是采用这种思路,基本都是hash上链,就是将内容文件进行hash运算得到hash值,将这个hash值存到区块链中,而将原文存到某一台中心服务器,当要使用原文时就到链上取到对应的hash值,然后使用相同的哈希算法计算出hash值,接着对比这两个hash值来判断原文件是否被修改过,通过这种做法间接保证了原文数据的不可篡改性。至于为什么不直接原文上链,因为原文的数据比较大,如何有效存储庞大的数据是当前区块链面临的问题,但是随着时间的推移相信会有成熟的解决方案的。

除了hash上链这一场景,在区块链中的非对称加密也使用到了哈希算法。简单讲一下非对称加密的过程:
A想要发送消息给B,A首先会对消息原文进行数字摘要(哈希算法也称为摘要算法),然后使用自己的私钥对摘要进行签名(就是加密)得到数字签名,然后使用B的公钥对原文进行加密(B的公钥是公开的),接着将密文以及数字签名发送给B,B拿到这两个信息之后使用A的公钥(A的公钥也是公开的)对数字签名进行解密得到一个hash值,暂时称为Hash1,然后使用自己的私钥对密文进行解密得到原文(这一步保证的是原文是发给B的,而不是发给C或者D,因为只有B的私钥才可以解开密文),拿到原文之后B就还是使用相同的哈希算法对这个原文进行哈希运算得到Hash2,将Hash1与Hash2进行对比,如果完全一致则说明消息在传输的过程中没有被篡改过。这就解决了两个问题,一个是明确消息发给谁,而是消息在传输过程中没有被篡改。

哈希算法的种类

讲完哈希算法的运用场景,现在来讲讲哈希算法的种类,哈希算法主要有MD5、SHA1、SHA2、SHA256、SHA512、SHA3

MD5是输入不定长度信息,输出固定长度128bits的算法,但是这个算法在04年就被破解了,而SHA1也在17年被Google攻破,目前比较常用的是SHA2和SHA3,这两个都支持了更长的摘要信息输出,提高了安全性,SHA2主要有SHA224、SHA256、SHA384和SHA512,数字后缀表示它们生成的哈希摘要结果长度

代码演示

下面使用Go语言对MD5以及SHA256进行代码演示:

MD5

func MD5(){
    h := md5.New()
    io.WriteString(h, "Hello World!")
    fmt.Printf("%x\n", h.Sum(nil))
}

output:

ed076287532e86365e841e92bfc50d8c

SHA256

func SHA256() {
    hash256 := sha256.New()
	io.WriteString(hash256, "Hello World!")
	fmt.Printf("%x\n", hash256.Sum(nil))
}

或者:

func SHA256() {
    sum256 := sha256.Sum256([]byte("Hello World!"))
    fmt.Printf("%x\n", sum256)
}

output:

7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值