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编码来显示或传输签名 - 验证时需要使用相同的哈希算法和公钥

