golang实现RSA2的签名与验签函数
2023-02-18 15:37:00 时间
使用非对称加密算法,实现签名与验签
package tools import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/pem" "errors" ) // RSA2私钥签名 func Rsa2PriSign(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) { 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 } // RSA2公钥验证签名 func Rsa2PubCheckSign(signContent, sign, publicKey string, hash crypto.Hash) bool { hashed := sha256.Sum256([]byte(signContent)) pubKey, err := ParsePublicKey(publicKey) if err != nil { return false } sig, _ := base64.StdEncoding.DecodeString(sign) err = rsa.VerifyPKCS1v15(pubKey, hash, hashed[:], sig) if err != nil { return false } return true } // 解析公钥 func ParsePublicKey(publicKey string) (*rsa.PublicKey, error) { 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 }
测试用例
package tools import ( "crypto" "log" "testing" ) const ( // 私钥 PRIVATE_KEY = ` -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAvSa9KsScy+ZuFTiPLE7ZwMacmxmA6A8fu0jiPluliLwutgRO TTZp3g9HmW1CuYt+ZoQH9t0JzHHNFu9yCetJdt5TrpQx9bBovTsh8h/ZQOPsyo0p nKqi5G3x1Azvbzs6yTU8voz6xVT90/DVJcd71osTsn+7ajEZccfa35tl5DBdF95t hWeyMz5p6ayFMUEU10HBUYmYTUzi4dvXcZUZvLOIOPMHoCTXcX98EmGqUvsLWpx8 mscaA5llZMg+ZXnT5OH+HW9ncfz7DqXiON3yo1BrNPdmN+Y4SI9dWrADUzGJO6u5 8OwncCphUsYqnlG2jd4n0JhjpA2WGD4c6zqJJQIDAQABAoIBAAOmqMYXj3M8Gmnc cp8HUpqu+rzfrCZOjG1ABeXwPOy7vScURDKnVznLD7W9bylHsQPnjoPMVnEUzUGh E5FvcjaSKglXoPM+GXd1mb0jsjzXaW2rdd8pSAWivaU7Lq/187eIiIihDgIbFt8t ad/VzuUgQBwU7RgqpHQWyHnCdSAHanV6TDDzRssJPdVBVLHOgmiMthSw8OtJiXy7 p8oKVsMiLk/+nNKXBorpx4EhYdB4u+XreMBChLT/AYQfZ6Q9xvAVoRnSaFplvqNw Xlxwo0T5tMZLla4QafZ+fQM9GvDudv2NebHvDbL6zTefthCYDK8utaQpcnm70WBp NFdOuW0CgYEA4EAmFxhdop7T+iLcG4LMXAGhvyEmArtQftsfUKcuYV/vXbsX0pj/ 64WmriVfFhyW+d27ZrDZ0knT9in6zfxER3mAigVvd5SJ2co10HiiIRNfMZKXjc3g pKukPAw0fsrBhp1Cdml649RZnTdl7FaUs6xmWIszQi2fUca8HlF3wBMCgYEA1+5v WTV+rcVh9qhs2y8feuWWkmYDVZMbmgE+V+bo4o/6T7FGGKen1EGWV46GiVBix31p WSfMTOIZ7BEhRMU0GH0TGSM6yqsKF4Qu8jg9fxKt4tEMrPmvw/+VoHN+HLV790hP G5Q+I2zDknCWvoWkEDC3y3O4YPh/Cpif/ubZ6OcCgYAePchlOO33rj+b7fOM6jiw 969eXRQJLkWOtfIlKEaC7zMSitaNmgB5PI7b0UJfcv+RNqu9D4BwcXBaNBMUkD6M /P+unUkI8Ukdy70yHfKPT1N5FfHGN8thqZv+VQ8HQkSS6MY7vcHK06o6H2xpUMvA 5zDuI+eHtytTFd/snsPtbQKBgCFM8TklydqMtTXv9ZG767PtUlJTjzIUVM5kYLP3 tXSzVZwSr8e/m19dmgz4uwDUN9eiHKwWOiilOfAxGBtd+lHIgDiBOWDmDdFgnkjW qY0+WTjAmp7WhufIM9Ah35IX3v1c1m5fZ1HZRTQBTw4k2A9zI/UpbIbv68+7h/ks qvCDAoGAF0jwXqwZu0CJB+ojr6dawYXNalEKH7bMPyItdHK4PqWcftHjYXQthnQC uOeS4tEa3nfahGhp68U9N18L3h3gkkHqIGJvPzAEIjaIeghkQ73RinA/94ZlUBm4 jVGL8OEtfrm3O6ukVFTaiBMXPwAN4e3qfkXuyRepN0DjUthymes= -----END RSA PRIVATE KEY----- ` // 私钥 PUBLIC_KEY = ` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvSa9KsScy+ZuFTiPLE7Z wMacmxmA6A8fu0jiPluliLwutgROTTZp3g9HmW1CuYt+ZoQH9t0JzHHNFu9yCetJ dt5TrpQx9bBovTsh8h/ZQOPsyo0pnKqi5G3x1Azvbzs6yTU8voz6xVT90/DVJcd7 1osTsn+7ajEZccfa35tl5DBdF95thWeyMz5p6ayFMUEU10HBUYmYTUzi4dvXcZUZ vLOIOPMHoCTXcX98EmGqUvsLWpx8mscaA5llZMg+ZXnT5OH+HW9ncfz7DqXiON3y o1BrNPdmN+Y4SI9dWrADUzGJO6u58OwncCphUsYqnlG2jd4n0JhjpA2WGD4c6zqJ JQIDAQAB -----END PUBLIC KEY----- ` ) func TestRsa2Rsa2PriSign(t *testing.T) { //原内容 str := "F78691A5-2963-42D2-A0C7-3A4F31CF5EB6" //生成签名 sig := Rsa2PriSign(str, PRIVATE_KEY, crypto.SHA256) log.Println(sig) //验证原内容与签名是否一致 res := Rsa2PubCheckSign(str, sig, PUBLIC_KEY, crypto.SHA256) log.Println(res) }
验证成功!
相关文章
- 【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析
- linux-ext4格式文件误删除,该如何恢复?
- linux挂载新硬盘并进行分区格式化
- linux系统下文件误删除该如何恢复?
- MongoDB设计方法及技巧
- 实践GoF的23种设计模式:建造者模式
- 设备如何使用go sdk轻松连接华为云IoT平台?
- 一个故事看懂Linux文件权限管理
- 闯荡Linux帝国:nginx的创业故事
- 实践GoF的设计模式:单例模式
- Go 1.18 新特性:多模块工作区模式
- 用过 mongodb 吧, 这三个大坑踩过吗?
- 教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了
- 使用mongodb作为Quartz.Net下的JobStore实现底层的持久化机制
- mongodb之使用explain和hint性能分析和优化
- mongodb 3.x 之实用新功能窥看[2] ——使用$lookup做多表关联处理
- mongodb 3.x 之实用新功能窥看[1] ——使用TTLIndex做Cache处理
- 双十一来了,别让你的mongodb宕机了
- 分享几个你可能不知道的交互式Git 命令
- 实践GoF的23的设计模式:SOLID原则(下)