• Golang-RSA2签名及验签


    RSA2签名及验签

    const (
        // 私钥 PEMBEGIN 开头
        PEMBEGIN = "-----BEGIN RSA PRIVATE KEY-----\n"
        // 私钥 PEMEND 结尾
        PEMEND = "\n-----END RSA PRIVATE KEY-----"
        // 公钥 PEMBEGIN 开头
        PUBPEMBEGIN = "-----BEGIN PUBLIC KEY-----\n"
        // 公钥 PEMEND 结尾
        PUBPEMEND = "\n-----END PUBLIC KEY-----"
    )
    // RSA2私钥签名
    func Rsa2Sign(signContent string, privateKey string, hash crypto.Hash) string {
        shaNew := hash.New()
        shaNew.Write([]byte(signContent))
        hashed := shaNew.Sum(nil)
        priKey, err := ParsePrivateKey(privateKey)
        if err != nil {
            return ""
        }
     
        signature, err := rsa.SignPKCS1v15(rand.Reader, priKey, hash, hashed)
        if err != nil {
            return ""
        }
        return base64.StdEncoding.EncodeToString(signature)
    }
     
    // 私钥验证
    func ParsePrivateKey(privateKey string) (*rsa.PrivateKey, error) {
        privateKey = FormatPrivateKey(privateKey)
        block, _ := pem.Decode([]byte(privateKey))
        if block == nil {
            return nil, errors.New("私钥信息错误!")
        }
        priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
        if err != nil {
            return nil, err
        }
        return priKey, nil
    }
     
    // 组装私钥
    func FormatPrivateKey(privateKey string) string {
        if !strings.HasPrefix(privateKey, PEMBEGIN) {
            privateKey = PEMBEGIN + privateKey
        }
        if !strings.HasSuffix(privateKey, PEMEND) {
            privateKey = privateKey + PEMEND
        }
        return privateKey
    }
     
    // RSA2公钥验证签名
    func Rsa2PubSign(signContent, sign, publicKey string, hash crypto.Hash) bool {
        hashed := sha256.Sum256([]byte(signContent))
        pubKey, err := ParsePublicKey(publicKey)
        if err != nil {
            log.Errorf(err, "rsa2 public check sign failed.")
            return false
        }
        sig, _ := base64.StdEncoding.DecodeString(sign)
        err = rsa.VerifyPKCS1v15(pubKey, hash, hashed[:], sig)
        if err != nil {
            log.Errorf(err, "rsa2 public check sign failed.")
            return false
        }
        return true
    }
     
    // 公钥验证
    func ParsePublicKey(publicKey string) (*rsa.PublicKey, error) {
        publicKey = FormatPublicKey(publicKey)
        block, _ := pem.Decode([]byte(publicKey))
        if block == nil {
            return nil, errors.New("公钥信息错误!")
        }
        pubKey, err := x509.ParsePKIXPublicKey(block.Bytes)
        if err != nil {
            return nil, err
        }
        return pubKey.(*rsa.PublicKey), nil
    }
     
    // 组装公钥
    func FormatPublicKey(publicKey string) string {
        if !strings.HasPrefix(publicKey, PUBPEMBEGIN) {
            publicKey = PUBPEMBEGIN + publicKey
        }
        if !strings.HasSuffix(publicKey, PUBPEMEND) {
            publicKey = publicKey + PUBPEMEND
        }
        return publicKey
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
  • 相关阅读:
    C# Linq增强扩展MoreLinq之Aggregate(对序列应用累加器)
    数据结构之链表详解(2)——双向链表
    接口测试 Jmeter 接口测试 —— 请求 Headers 与传参方式
    19. 机器学习——朴素贝叶斯
    【PHP设计模式03】抽象工厂模式
    Redis 读写分离和哨兵机制
    Leetcode 15. 三数之和
    Mysql时间操作
    Java 异常处理机制
    摸鱼也摸鱼之在线数独自动求解
  • 原文地址:https://blog.csdn.net/caiqm_kid/article/details/125560700