问题描述
我按照文档中的说明进行操作,并尝试在Node中执行相同的公式,但是,当我收到11|Session|
响应时,我无法对服务器进行正确的身份验证。我认为该错误是由于错误地设置了随机数和/或密码摘要而引起的。
公式:Base64(SHA1($NONCE + $TIMESTAMP + SHA1($CLEARPASSWORD)))
变量:$CLEARPASSWORD=AMADEUS
,$TIMESTAMP=2015-09-30T14:12:15Z
,$NONCE=c2VjcmV0bm9uY2UxMDExMQ==
。
预期的哈希值:+LzcaRc+ndGAcZIXmq/N7xGes+k=
我尝试的代码是:
const crypto = require('crypto')
const hashedPassword = crypto.createHash('sha1').update(CLEARPASSWORD).digest() // Returns a buffer
crypto.createHash('sha1').update(NONCE + TIMESTAMP + hashedPassword).digest('base64') // Returns a Base64 String
但是,这将返回DDcZEaS5AtoVaZhsARy9MqV+Y34=
。而且,如果我将随机数更改为纯字符串secretnonce10111
,那么我得到的gHOoqyDb9YJBrk30iabSO8nKxio=
仍然不正确。
我不确定可能是什么问题。
解决方法
我终于弄清楚出了什么问题。问题是我试图从一开始就将所有内容都设为缓冲区,所以我试图用Buffer连接字符串。
所以,而不是
const hashedPassword = crypto.createHash('sha1').update(CLEARPASSWORD).digest()
crypto.createHash('sha1').update(NONCE + TIMESTAMP + hashedPassword).digest('base64')
应该是
const buffer = Buffer.concat([Buffer.from(NONCE),Buffer.from(TIMESTAMP),nodeCrypto.createHash('sha1').update(CLEARPASSWORD).digest()])
const hashedPassword = nodeCrypto.createHash("sha1").update(buffer).digest("base64")