Как сгенерировать вход HMAC-SHA-256 в javascript для передачи данных?

#javascript #angular #sha256 #cryptojs

#javascript #angular #sha256 #cryptojs

Вопрос:

У меня есть проект Angular, в котором я должен реализовать оплату передачи данных. Но я не могу сгенерировать знак для оплаты.

Я следую процессу, указанному по этой ссылке (введите описание ссылки здесь), чтобы сгенерировать знак.

Но я не могу этого достичь.

Я использую angular library crypto-js для генерации строки со знаком HMAC-SHA-256.

Вот мой код javascript.

 const merchantId = 'xxxxxxx';
const refNo = '1234567890';
const amount = 0;
const currency = 'CHF';
const theme = 'DT2015';
const paymentmethod = 'VIS';

const stringSs = merchantId amount currency refNo;

const base = 16;
// My Hmac Key
const s = 'fa3d0ea1772cf21e53158283e4f123ebf1eb1ccfb15619e2fc91ee6860a2e5e48409e902b610ce5dc6f7f77fab8affb60d69b2a7aa9acf56723d868d36ab3f32';

// Step 1: Code to generate hex to byte of hmac key
const a = s.replace(/../g, '$amp;_').slice (0, -1).split ('_').map ((x) => parseInt (x, base));

//  Step 3: Sign the string with HMAC-SHA-256 together with your HMAC key
const signedString = HmacSHA256(a, stringSs);

// Step 4: Translate the signature from byte to hex format
const signString = enc.Hex.stringify(signedString);
  

Можете ли вы помочь мне в этом, чтобы подсказать, что я делаю неправильно или каким образом этого можно достичь.

Ответ №1:

Вы можете сделать это с помощью криптографии (нет необходимости устанавливать дополнительные библиотеки)

 // Typescript
import * as crypto from 'crypto';

function signKey (clientKey: string, msg: string) {
    const key = new Buffer(clientKey, 'hex');
    return crypto.createHmac('sha256', key).update(msg).digest('hex');
}
  
 // Javascript
const crypto = require('crypto')

function signKey (clientKey, msg) {
    const key = new Buffer(clientKey, 'hex');
    return crypto.createHmac('sha256', key).update(msg).digest('hex');
}
  
 signKey(s, stringSs)
  

Ответ №2:

Чтобы ответить на вопрос для crypto-js (см.https://github.com/brix/crypto-js ) в соответствии с запросом, следующее сделает свое дело:

 // Javascript; example from datatrans documentation using a random key
stringSs ='3000017692850CHF91827364';
key='1ca12d7c0629194a9f9d0dbbc957709dd3aed385925b077e726813f0b452de6a38256abd1116138d21754cfb33964b6b1aaa375b74d3580fcda916898f553c92';
expectedSign='d7dee9ae1e542bc02bcb063a3dd3673871b2e43ccb4c230f26e8b85d14e25901';

signedString = CryptoJS.HmacSHA256(stringSs, CryptoJS.enc.Hex.parse(key));
resultSign = CryptoJS.enc.Hex.stringify(signedString);

// now resultSign == expectedSign is true :-)

  

Подход черепашек ниндзя был почти правильным, за исключением шага 1, шестнадцатеричного преобразования в байт. Вместо этого используйте встроенную функцию Crypto-JS, и все работает так, как ожидалось.