我遵循文档中的说明,并试图在Node中执行相同的公式,但是,在接收到11|Session|响应时,我无法正确地对服务器进行身份验证。我假设错误是由于错误地设置了nonce和/或密码摘要。
公式: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=仍然是不正确的。
我不知道会有什么问题。
发布于 2020-08-18 02:51:56
我终于弄明白了到底是怎么回事。问题是,我试图连接一个字符串和一个缓冲区,而我应该从一开始就让所有的东西都成为一个缓冲区。
所以,而不是
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")发布于 2022-01-07 07:49:08
you can use this php code to generate Digest Password
<?php
date_default_timezone_set('UTC');
$t = microtime(true);
$micro = sprintf("%03d",($t - floor($t)) * 1000);
$date = new DateTime( date('Y-m-d H:i:s.'.$micro) );
echo $timestamp = $date->format("Y-m-d\TH:i:s").$micro . 'Z';
$nonce = mt_rand(10000000, 99999999);
echo $nounce = base64_encode($nonce);//we have to decode the nonce and then apply the formula on it and in xml we have to send the encoded nonce
$password = "AMADEUS"; //clear password
echo $passSHA = base64_encode(sha1($nonce . $timestamp . sha1($password, true), true));
?>https://stackoverflow.com/questions/63406227
复制相似问题