Как успешно расшифровать зашифрованный контент AES-256, сгенерированный с помощью OpenSSL в Node.js, с помощью CryptoJS - PullRequest
0 голосов
/ 08 октября 2019

Context

У меня есть функция Node.js AWS Lambda, которая действует как пользовательский авторизатор и запускается AWS API Gateway, которая должна брать токен из заголовка Authorization, который являетсяAES-256 зашифровал JSON и расшифровал его с помощью CryptoJS и секретной парольной фразы. Просто к сведению, токен не является JWT. Я следовал CryptoJS документам, но он просто не работает. Я прочитал десятки постов и статей, и для меня действительно удивительно, что я не смог найти никого, кто пробовал бы такой простой подход, как мой.

Шаги и код

1) Яу меня есть файл с именем token.json , содержащий строковый объект JSON:

"{"user_id":1,"name":"user","time":"2019-09-27 13:58:22","env":"dev"}"

2) Следуя примерам CryptoJS, в терминале, который я выполняю: openssl enc -aes-256-cbc -in token.json -out encrypted-json-token -pass pass:"password" -e -A -base64

Я использую опцию -A, чтобы получить строку в одну строку. Согласно openssl enc --help:

-A Используется с - [base64 | a] для указания буфера base64 в виде одной строки

3) Я беру этот выводзашифрованный токен и отправив его в качестве значения для заголовка Authorization в HTTP-запросе, который анализируется AWS API Gateway, который получает этот заголовок и передает его в мою функцию Lambda.

4) ВЛямбда-функция:

const AES = require('crypto-js/aes');
const Utf8 = require('crypto-js/enc-utf8');

module.exports.authenticate = function authenticate(event, context, callback) {
...
  try {
    const token = event.authorizationToken;
    const decryptedToken = AES.decrypt(token, 'password').toString(Utf8);
    const parsedToken = JSON.parse(decryptedToken);
  }
  catch(error){
  // log error
  }
...
}

Результатом дешифрования является пустая строка, и, следовательно, синтаксический анализ в JSON завершается неудачей.

Заключительные замечания

Я звоню .toString(Utf8)поскольку согласно , и , , результатом операции дешифрования является объект Word Array , и мне нужно вернуть его обратно в исходную строковую форму,который должен быть строковым токеном JSON. Кроме того, я тестирую все это с помощью автономного подключаемого модуля без сервера для локальной эмуляции API-шлюза.

1 Ответ

1 голос
/ 08 октября 2019

TL;DR : Передайте действительный ключ AES, закодированный в виде шестнадцатеричного кода, используя флаг -K.

Если вы внимательно прочитаете документацию для openssl enc, вы заметите разницумежду флагами -pass (-k) и -K - первый буквально является паролем, второй - действительным ключом.

Если вы используете -pass, вы фактически передаетепроизвольный строковый пароль, который подается через (устаревший и небезопасный) KDF, EVP_KDF. Если вы используете -K, вы можете передать настоящий ключ AES в виде шестнадцатеричной строки.

Поскольку EVP_KDF небезопасен, я бы порекомендовал последнее.

...