Golang 使用公钥签名

问题描述 投票:0回答:1

任何人都可以建议一种修改以下代码的方法,以便我可以使用我包含的常量公钥吗?我无法更改它并使其以常量工作。

package main
import (
    "golang.org/x/crypto/nacl/sign"
    "crypto/rand"
    "log"
    "encoding/base64"
    "encoding/json"
    "io/ioutil"
    "net/http"
"github.com/gin-gonic/gin"
// "os"
// "strings"

)

type authtoken struct {
    Cookie  string  `json:"cookie"`
}


type user struct {
    Username  string  `json:"username"`
    Password string  `json:"password"`
}

var users []user

var pubkey *[64]byte
var privkey *[32]byte

const pubkeyStr = "123eRhvE0bqx81t3G9o79LOkkR4CK9Cyhvt8-QJ-s1H2A6uSwukUI0CYUlc3WbmIAa3VTo4Jm9RF5F0Af4DzmQ"

func login(c *gin.Context) {
    var tryUser user
    if err := c.BindJSON(&tryUser); err != nil {
        return
    }

    for _, user := range users {
        if user == tryUser {
            // Convert the constant public key string to bytes
            pubkey := []byte(pubkeyStr)
            //token = authtoken{Username: user.Username}
            //out := make([]byte, 300)
            out := make([]byte,0)
            log.Println("username", []byte(user.Username), "pubkey",pubkey)
            signedtokenout := sign.Sign(out, []byte(user.Username), pubkey)
            log.Println("signed token:",signedtokenout)
            signedtokenstr := base64.RawURLEncoding.EncodeToString(signedtokenout[:])
            c.IndentedJSON(http.StatusOK, gin.H{"cookie":signedtokenstr})
            c.IndentedJSON(http.StatusOK, gin.H{"my pubkey is":base64.RawURLEncoding.EncodeToString(pubkey[:])})
            return
    }
}
c.IndentedJSON(http.StatusForbidden, "wrong")

}

func home(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, gin.H{"my pubkey is":base64.RawURLEncoding.EncodeToString(pubkey[:])})
}

func main() {

    bytes, err := ioutil.ReadFile("users.json")
    if err != nil {
    log.Println("Unable to load users file!")
    return
    }
    err = json.Unmarshal(bytes, &users)
    if err != nil {
        log.Println("Unable to unmarshal users file!")
        return
    }


    privkey,pubkey, _ = sign.GenerateKey(rand.Reader)
    // if err != nil {
    //      log.Fatal("could not GenerateKey", err)
    // }
    log.Printf("\n\nThe public key is:%v\n\nThe private key is:%v\n", pubkey,privkey)

    pubstr := base64.RawURLEncoding.EncodeToString(pubkey[:])
log.Println("\nThe encoded public key:", pubstr)

router := gin.Default()

router.POST("/login", login)
router.GET("/", home)

router.Run("0.0.0.0:80")

}

我希望能够在整个代码中用常量 pubkey 替换“var pubkey *[64]byte”。目前,运行它时,它会在主函数中生成当前预期的随机密钥,但不是我需要的。 我知道“类型”不正确,但我不知道如何修改它。

如有任何帮助,我们将不胜感激。

go public-key
1个回答
0
投票

我希望能够在整个代码中用常量 pubkey 替换

var pubkey *[64]byte

我认为你不能完全做到这一点,但你可以在

init
中初始化一个全局变量:

var pubkey *[64]byte
const pubkeyStr = "123eRhvE0bqx81t3G9o79LOkkR4CK9Cyhvt8-QJ-s1H2A6uSwukUI0CYUlc3WbmIAa3VTo4Jm9RF5F0Af4DzmQ"

func init() {
  pubkey = &[64]byte{}
  copy(pubkey[:], pubkeyStr)
}

这样,您就可以在包中的任何其他位置引用

pubkey
,它将具有预期的值。

© www.soinside.com 2019 - 2024. All rights reserved.