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,分别代表管理员、普通用户、共识节点、普通节点。