在Golang中,我们可以使用第三方库来生成HS、RS、ES和ED签名密钥。
- HS(HMAC-SHA)签名密钥生成
对于HS签名算法,我们需要生成一个随机的秘钥key。下面是示例代码:
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
)
func generateHSKey() (string, error) {
key := make([]byte, 32)
_, err := rand.Read(key)
if err != nil {
return "", err
}
// 将字节数组编码为base64字符串
encodedKey := base64.StdEncoding.EncodeToString(key)
return encodedKey, nil
}
func main() {
key, err := generateHSKey()
if err != nil {
panic(err)
}
fmt.Println(key)
}
在上面的代码中,我们使用crypto/rand包生成一个32字节的随机秘钥key,并将其编码为base64字符串返回。
- RS(RSA)签名密钥生成
对于RS签名算法,我们需要生成一对公私钥。下面是示例代码:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
)
func generateRSKeys() (string, string, error) {
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
return "", "", err
}
privatePEMBlock := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(privateKey),
}
privatePEM := pem.EncodeToMemory(privatePEMBlock)
publicKey := privateKey.PublicKey
publicASN1, err := x509.MarshalPKIXPublicKey(&publicKey)
if err != nil {
return "", "", err
}
publicPEMBlock := &pem.Block{
Type: "PUBLIC KEY",
Bytes: publicASN1,
}
publicPEM := pem.EncodeToMemory(publicPEMBlock)
return string(privatePEM), string(publicPEM), nil
}
func main() {
privateKey, publicKey, err := generateRSKeys()
if err != nil {
panic(err)
}
fmt.Println("Private key:")
fmt.Println(privateKey)
fmt.Println("Public key:")
fmt.Println(publicKey)
}
在上面的代码中,我们使用crypto/rsa包生成了一对2048位的RSA公私钥,并将其转换为pem格式字符串返回。
- ES(ECDSA)签名密钥生成
对于ES签名算法,我们需要生成一对椭圆曲线公私钥。下面是示例代码:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"encoding/pem"
"fmt"
)
func generateESKeys() (string, string, error) {
curve := elliptic.P256()
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
return "", "", err
}
privBytes, _ := x509.MarshalECPrivateKey(privateKey)
privPem := &pem.Block{
Type: "EC PRIVATE KEY",
Bytes: privBytes,
}
pubBytes, _ := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
pubPem := &pem.Block{
Type: "EC PUBLIC KEY",
Bytes: pubBytes,
}
return string(pem.EncodeToMemory(privPem)), string(pem.EncodeToMemory(pubPem)), nil
}
func main() {
privateKey, publicKey, err := generateESKeys()
if err != nil {
panic(err)
}
fmt.Println("Private key:")
fmt.Println(privateKey)
fmt.Println("Public key:")
fmt.Println(publicKey)
}
在上面的代码中,我们使用crypto/ecdsa包生成了一对椭圆曲线公私钥,并将其转换为pem格式字符串返回。
- ED(Ed25519)签名密钥生成
对于ED签名算法,我们需要生成一个Ed25519秘钥。下面是示例代码:
package main
import (
"crypto/rand"
"crypto/ed25519"
"encoding/hex"
"fmt"
)
func generateEDKey() (string, error) {
pubkey, privkey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
return "", err
}
pubkeyStr := hex.EncodeToString(pubkey)
privkeyStr := hex.EncodeToString(privkey)
return privkeyStr + pubkeyStr, nil
}
func main() {
key, err := generateEDKey()
if err != nil {
panic(err)
}
fmt.Println(key)
}
在上面的代码中,我们使用crypto/ed25519包生成了一个Ed25519秘钥,并将其编码为hex格式字符串返回。