Проблема с созданием сборника паролей для Amadeus SOAP API

#node.js #soap #hash #cryptography #amadeus

#node.js #soap #хэш #криптография #amadeus

Вопрос:

Я следовал инструкциям в документах и попытался выполнить ту же формулу в 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= , что по-прежнему неверно.

Я не уверен, в чем может быть проблема.

Ответ №1:

Я, наконец, понял, что было не так. Проблема заключалась в том, что я пытался объединить строку с буфером, когда я должен был просто сделать все буфером с самого начала.

Итак, вместо

 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")
  

Ответ №2:

 you can use this php code to generate Digest Password

<?php
date_default_timezone_set('UTC');
$t = microtime(true);
$micro = sprintf("d",($t - floor($t)) * 1000);
$date = new DateTime( date('Y-m-d H:i:s.'.$micro) );
echo $timestamp = $date->format("Y-m-dTH: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));   
?>