我需要签署一条消息以提交到远程服务(通过 websocket)。为此,我需要基于整数(我的用户 ID)和密码(base64 编码的字符串)构造一个私钥,并使用 SHA224 进行哈希处理。我正在使用 golang 和 crypto/ecdsa 以及随附的字节编码包等。
这是我拥有的文档:
签名使用椭圆曲线数字签名算法 (ECDSA) 编码的消息,其中包含:用户 ID、服务器随机数、客户端节点和私钥。使用 SHA224 对您的用户 ID 和密码进行散列生成私钥。
这是我的功能:
func NewKey(userId int64, pass string) (prKey ecdsa.PrivateKey) {
buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, userId)
passArr := []byte(pass)
sha := sha256.New224()
sha.Write(buf.Bytes())
sha.Write(passArr)
sum := sha.Sum(nil)
var in int64
reader := bytes.NewReader(sum)
err := binary.Read(reader, binary.BigEndian, &in)
if err != nil {
log.Fatal(err)
}
prKey.D = big.NewInt(in)
prKey.PublicKey.Curve = elliptic.P224()
return prKey
}
我对这个函数的意图是:
散列 userId 并正确传递
[]byte
使用 SHA224。将其读入
int64
然后用作私钥构造一个实例
ecdsa.PrivateKey
并ecdsa.PublicKey
正确对应返回用于
ecdsa.Sign()
函数调用的键
然后我签署另一条由 userId(整数)和两个 nonce 组成的消息。
这是我签署消息的方式:
key := NewKey(userId, pass) // the above func
msg := sha256.New224().Sum([]byte(userId + srNonce + clNonce))
r, s, err := ecdsa.Sign(rand.Reader, &key, msg)
sig := []string{enc(r.String()), enc(s.String())}
问题:
我的
NewKey
功能正确吗?和组件非常大 - 大概是因为我正在
r
使用. 这可能是一个问题吗?s
int64
拥有这两个项目的行是否
sha256.New224().Sum([]byte(userId + pass))
“正确”?如何正确创建我的私钥(假设它是错误的)并随后签署消息?
我对 ECDSA 非常陌生,并且一般具有基本的加密知识。