#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));
?>