我需要签署一条消息,提交给远程服务(通过websocket)。为此,我需要构建一个基于整数(我的用户ID)和密码(base64编码的字符串)的私钥。使用SHA224进行哈希处理。我使用golang和crypto / ecdsa,并附带字节码编码等。
这是我的文档:
签名使用椭圆曲线数字签名算法(ECDSA) 编码消息包含:用户ID,服务器随机数,客户端节点和 私钥。生成的私钥会散列您的用户ID和您的用户ID 密码为SHA224。
这是我的功能:
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并使用SHA224在[]byte
中正确传递。
将其读入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非常陌生并且具有基本的加密知识。
答案 0 :(得分:0)
回答我自己的问题:
我的NewKey功能是否正确?
没有
r和s组件非常大 - 可能是因为我使用的是int64。这可能是一个问题吗?
它们应该很大。
是行sha256.New224()。总和([]字节(userId + pass))"正确"哈希这两个项目?
在我传递[]byte
之前,这是正确的。
如何正确创建我的私钥(假设它错了)和 随后签署消息?
密钥需要big.Int
,因此假设哈希是正确的,使用以下内容就足够了:
key := new(big.Int).SetBytes(sum)