区块链之旅(六)Hash函数 & 数字签名 | 入驻第十三天

644 阅读5分钟

Hash函数

简介

一种算法,也称散列函数,消息摘要函数,单向函数或杂凑函数,任意程度的二进制数据映射为固定长度的二进制数据。

特点

  • 确定性:对同一个输入的数据,无论重复计算多少次,结果相同。
  • 单向性:hash函数的数学原理无逆运算,不能将hash值转换成加密前的信息。
  • 隐秘性:已知hash值的情况下,没有可行的办法算出函数的输入值。、
  • 防篡改:任何微小的输入都有可能对输出产生巨大的影响。
  • 抗碰撞:任意两个不同的数据库,hash值相同的可能性极小。

实现

MD系列、SHA系列

MD5

package main
import(
	"fmt"
    "crypto/md5"
    "encoding/hex"
)
func main(){
    //方法一
    data:=[]byte("hello world")
    s:=fmt.Sprintf("%x",md5.Sum(data))
    fmt.Println(s)
    //方法二
    h:=md5.New()
    h.Write(data)
    s= hex.EncodeToString(h.Sum(nil))
    fmt.Println(s)
}

SHA256

package main
import(
	"fmt"
    "github.com/nebulasio/go-nebulas/crypto/hash"
    "encoding/hex"
	"crypto/sha256"    
)

func main(){
    //方法一 一个方法直接输出
    data:=[]byte("hello world")
    hash:=hash.Sha256(data)
    fmt.Println(hex.EncodeToString(hash))
    sha256.New()
    //方法二 按照步骤一步一步输出
    h:= sha256.New() //创建sha256算法
    h.Write(data)  //用sha256算法对参数a进行加密,得到8个变量
    hashTemp := h.Sum(nil)//将8个变量相加得到最终hash
    fmt.Println(hex.EncodeToString(hashTemp))
}

数字签名

简介

数字签名在信息安全,包括身份认证、数据完整性、不可否认性以及匿名性有着重要应用,是吸纳带密码学的重要分支。签名隶属于公钥密码学。

签名过程:发送方用自己的私钥对发送信息进行所谓的加密运算,得到一个hash值,该hash值就是签名。使用时需要将签名和信息发给接收方。接受者用发送方公开的公钥和接收到的信息对签名及逆行验证,通过认证,说明接受到的信息是完整的,准确的,否则说明消息来源不对。

普通签名

签名只是用一把私钥,并且是发送方自己进行的签名动作,这类签名就是普通签名,常用的签名方法有很多,包括RSA数字签名,DSS数字签名,ElGamal数字签名,ECDSA数字签名

eg:

ECDSA签名对数据helloworld进行签名,上链之前需要先进行验证,验证通过之后才能上链。

基本过程

  1. 通过ecdsa.GenerateKey产生一私钥;输出的私钥是指针类型。
  2. 通过私钥产生公钥
  3. 对数据进行hash运算,实际公链中就是挖矿过程
  4. 未来可以给任何长度的data进行签名,我们创建自己的签名方法。
  5. 验证数据是否合法,也就是通过公钥对签名进行验证,通过后才能对数据进行上链动作。

群签名

入群:群成员在入群之前候会给群管理进行申请入群,通过后,申请人会和群管理员达成交互式协议,该协议可生成群成员的私钥。群管理员队该密钥进行签名,并颁发给申请人,完成入群。群成员群管理员将群公钥对外开放。

签名:群成员通过自己的群密钥和群公钥对消息进行签名,获取群签名。

验证:通过输入群公钥和群签名用公开的某种验证方法进行验证,返回值只有真假,验证者无法计算得到签名者是群公钥里的具体成员,只知道该签名属于群公钥里面,可以代表群体。

追踪:群管理员可以通过群签名得到具体是哪个群成员进行去拿命的。

群签名是一个中心化的签名结构,该结构的算法都是群管理员定的,造成签名者的隐私没有左到真正的保证。

关键要素

  1. 只有群体中合法成员才能代表整个群体进行签名。
  2. 接收者可以用群公钥验证群签名的合法性,但不知道群签名使群体中具体哪个成员所签。
  3. 在发生争议时,群管理员可以识别出实际的签名者。

环签名

可以认为是不可追踪的群签名,实际的操作过程都是自己完成的,没有群管理员。

签名者是某个群体的成员,他把其他群体的公钥拿来并加上自己的公钥组成一个群公钥,然后用自己的私钥和群公钥要发布的信息进行环签名。接收者接受到群公钥、签名、和信息,然后对签名进行验证,如果签名来自群公钥,那么验证成功,否则消息不合法。

群公钥中的签名者的公钥只是迷惑作用,并不对数据进行任何操作。

形成的签名因为是每个其他群公钥产生的数据和自己用私钥产生的数据组成的环,自己的数据隐藏环中,攻击者很难找到签名者的公钥,所以签名者的隐私很好的被保护起来了。

盲签名

盲签名允许使用者获得一个消息的签名,而签名者即不知道该消息的内容,也不知道该消息的签名。

盲签名可用于需要提供匿名性的密码协议中,如电子投票和电子现金。

基本组成:

  1. 消息盲化:使用者利用盲因子对要签名的信息进行盲化处理,然后将盲化后的消息发送给签名者。
  2. 盲消息签名:签名者对盲化后的消息进行签名,因此他并不知道真实消息的具体内容。
  3. 恢复签名:使用者除去盲因子,得到真实消息的签名。

零知识证明

实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需要采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,当证明过程不能向验证者泄露任何关于被证明消息的信息。

简单理解,就是证明者能够在不向验证者提供任何有用信息的情况下,让验证者相信你。