Golang数字签名中出现乱码问题如何解决

Golang数字签名中出现乱码问题如何解决 当我尝试使用 rsa.SignPKCS1v15 对文档进行签名时 我得到类似这样的结果:"TP1�D�G��Ϳ�Mt�X��l�q��B׋��ǒ7�T��]�Ɠ�x�>�+qi(��z���Ns " 这看起来不太对劲 😊 我尝试用 node 进行签名,没有出现像 “�” 这样的字符

我尝试使用不同的私钥,结果是一样的。我的代码如下:

func main() {
    fmt.Println("hello world")
}
2 回复

这是直接将字节结果尝试作为字符串打印吗?

我不了解 Node 是如何处理的,但你这里得到的是原始字节,这是存储哈希/签名最节省内存的方式。

如果你想打印它,应该使用 base16、base26 或其他最适合你的编码方式。

更多关于Golang数字签名中出现乱码问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在数字签名过程中出现乱码通常是因为签名输出是二进制数据,而您可能试图直接将其作为字符串打印或处理。数字签名结果是一个字节切片([]byte),包含非UTF-8编码的二进制数据,直接转换为字符串会产生乱码字符。

以下是正确的处理方式:

package main

import (
    "crypto"
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "log"
)

func main() {
    // 生成或加载RSA私钥(这里简化为示例)
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        log.Fatal(err)
    }

    // 要签名的数据
    data := []byte("重要文档内容")

    // 计算哈希
    hashed := sha256.Sum256(data)

    // 使用PKCS#1 v1.5进行签名
    signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
    if err != nil {
        log.Fatal(err)
    }

    // 正确的方式:将签名结果编码为可读格式
    fmt.Printf("原始签名字节: %x\n", signature)
    fmt.Printf("Base64编码签名: %s\n", base64.StdEncoding.EncodeToString(signature))
    
    // 验证签名
    err = rsa.VerifyPKCS1v15(&privateKey.PublicKey, crypto.SHA256, hashed[:], signature)
    if err != nil {
        log.Fatal("签名验证失败:", err)
    }
    fmt.Println("签名验证成功")
}

如果您需要与Node.js等其他系统交互,建议使用Base64编码:

// 编码签名以便传输
base64Signature := base64.StdEncoding.EncodeToString(signature)
fmt.Println("Base64签名:", base64Signature)

// 解码签名进行验证
decodedSignature, err := base64.StdEncoding.DecodeString(base64Signature)
if err != nil {
    log.Fatal(err)
}

关键点:

  • 数字签名输出是二进制数据,不是文本
  • 使用十六进制(%x)或Base64编码来显示或传输签名
  • 验证时需要使用相同的哈希算法和公钥
回到顶部