我对认证过程的理解。主机创建一个secret
and a public api key
。客户端借助密钥对有效负载进行加密,这就是签名。然后将其公钥、有效负载、签名发送给主机。
示例客户端 https://github.com/bitfinexcom/bitfinex-api-node/blob/master/ws.js#L404
主机检查公钥是否允许执行操作,并根据客户端公钥获取秘密。在秘密的帮助下,主机解密签名并将其与有效负载进行比较。
Question
- 上述过程描述正确吗?
- 如何解密签名并将其与有效负载进行比较?
- 或者我应该以与客户端相同的方式对其进行加密,然后进行比较?
- 这两个步骤具体是做什么的
update
& digest
节点文档 https://nodejs.org/api/crypto.html#crypto_hmac_digest_encoding
Client:
authenticate: (self)->
payload = 'AUTH' + moment()
signature = crypto.createHmac('sha384', WEBSOCKET_SECRET)
.update(payload)
.digest('hex')
data = {
event: 'auth',
apiKey: WEBSOCKET_KEY,
authSig: signature,
authPayload: payload
}
self.send self, data
Server:
hmac = crypto.createHmac('sha384', WEBSOCKET_SECRET)
hmac.on 'readable', () ->
data = hmac.read()
if (data)
console.log data, data.toString('utf-8')
# hmac.write(authPayload)
hmac.write(signature)
hmac.end()
当前的服务器端解决方案
authenticate: (authPublicKey, authSignature, authPayload)->
signature = crypto.createHmac('sha384', WEBSOCKET_SECRET)
.update(authPayload)
.digest('hex')
return authSignature == signature