github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/core/access_contoller/crypto/README.md (about)

     1  # 简介
     2  
     3  crypto 模块提供了一些密码学算法 (包括加密、签名、哈希等) 能力及其相关的协议的接口。
     4  
     5  # 密码学算法
     6  
     7  ## 非对称密码学算法接口
     8  
     9  定义了如下的非对称体系公私钥接口:
    10  ```go
    11  // Signing options
    12  type SignOpts struct {
    13  	Hash HashType
    14  	UID  string
    15  }
    16  
    17  // === 秘钥接口 ===
    18  type Key interface {
    19  	// 获取秘钥字节数组
    20  	Bytes() ([]byte, error)
    21  
    22  	// 获取秘钥类型
    23  	Type() KeyType
    24  
    25  	// 获取编码后秘钥(PEM格式)
    26  	String() (string, error)
    27  }
    28  
    29  // === 非对称秘钥签名+验签接口 ===
    30  // 私钥签名接口
    31  type PrivateKey interface {
    32  	Key
    33  
    34  	// 私钥签名
    35  	Sign(data []byte) ([]byte, error)
    36  
    37  	SignWithOpts(data []byte, opts *SignOpts) ([]byte, error)
    38  
    39  	// 返回公钥
    40  	PublicKey() PublicKey
    41  
    42  	// 转换为crypto包中的 PrivateKey 接口类
    43  	ToStandardKey() crypto.PrivateKey
    44  }
    45  
    46  // 公钥验签接口
    47  type PublicKey interface {
    48  	Key
    49  
    50  	// 公钥验签
    51  	Verify(data []byte, sig []byte) (bool, error)
    52  
    53  	VerifyWithOpts(data []byte, sig []byte, opts *SignOpts) (bool, error)
    54  
    55  	// 转换为crypto包中的 PublicKey 接口类
    56  	ToStandardKey() crypto.PublicKey
    57  }
    58  
    59  ```
    60  SignOpts 结构用于为一个签名、验签操作提供灵活的流程变化。其中,Hash 字段可以设置哈希算法,例如 SHA256、SM3 等。UID 字段是 SM2-SM3 签名套件专用字段,用于设置国密局规定的 user ID。
    61  
    62  Key 接口定义了密码学公私钥通用的序列化接口,和一个返回密钥算法的 Type() 接口。
    63  
    64  PrivateKey 接口用于签名私钥,通常使用的是 SighWithOpts() 接口,其中入参 data 是数据原文,opts是一个 SignOpts 类型的结构,用于指定哈希算法,在 SM2-SM3 签名套件中也用于指定 user ID。在 ChainMaker中应用时,这个哈希算法可能读取自证书中指定的算法套件,也可能来自配置文件设置。
    65  
    66  ## 公私钥的序列化
    67  
    68  在应用中,公钥、私钥通常会以字符串形式保存在配置文件中或用于传输。前面提到的 Key 接口中的 String() 为公钥提供了序列化为 PEM 格式字符串的能力。
    69  
    70  要把字符串形式的公私钥反序列化为对象,可以调用 crypto/asym 包中的 PublicKeyFromPEM() 或 PrivateKeyFromPEM() 接口。ChainMaker 支持的算法都可以用这两个通用接口反序列化公私钥。
    71  
    72  # 证书
    73  
    74  ChainMaker 使用的节点、客户端证书需要满足一下要求:
    75  1. O 字段需要指明节点或客户端所属的组织的名称。
    76  2. OU 字段需要指明节点或客户端的身份,默认身份有四种:admin、client、consensus、common,分别代表管理员、普通用户、共识节点、普通节点。