在为Amadeus SOAP API创建密码摘要时出现问题

问题描述

我按照文档中的说明进行操作,并尝试在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")