Шифрование / дешифрование между Postgres и Node - PullRequest
0 голосов
/ 22 мая 2018

Проблема : Мы должны зашифровать определенный столбец в определенной таблице (Postgres).Он должен быть дешифруемым в SQL-запросах и в нашем прикладном уровне nodejs / sequelize.Шифрование может происходить в любом слое, но оно должно быть декодируемым из любого.

Проблема, с которой я сталкиваюсь (и я уверен, что это ошибка пользователя) заключается в том, что если я шифрую в БД, я могу толькорасшифровать в БД, и то же самое для узла.

Я пытался использовать PGP_SYM_ENCRYPT и ENCRYPT в postgres и crypto и crypto-js/aes в узле.Я дошел до того, что он расшифровывается без ошибки, но возвращает бред.

Несколько вещей, которые я до сих пор пробовал (тестовый ключ - thirtytwocharsthirtytwocharsplus):

set() {
  this.setDataValue('field', seq.cast(seq.fn('PGP_SYM_ENCRYPT', val, 
  config.AES_KEY), 'text'))
}

Это правильно записывает поле так, что PGP_SYM_DECRYPT его расшифрует, но (очевидно?) Нет способа сказать Sequelize обернуть имя поля вызовом функции, поэтому я чувствую, что это лишние js

const decipher = crypto.createDecipher('aes256', config.AES_KEY)
decipher.setAutoPadding(false);
return decipher.update(new Buffer(this.getDataValue('field', 'binary'), 'binary', 'ascii')) + decipher.final('ascii')

Это декодирует поле, но возвращает значение (�Mq��8Ya�b) вместо значения (test)

aes.encrypt('test', config.AES_KEY)
aes.decrypt(field, config.AES_KEY).toString(CryptoJS.enc.Utf8)

Это прекрасно шифрует, отлично дешифрует, ноОшибки Postgres при попытке расшифровать (используя PGP_SYM_DECRYPT или DECRYPT).Приведение полученного поля к ::TEXT и вставка его в онлайн-расшифровщик AES возвращает ожидаемое значение.

I действительно хотят избежать необходимости добавлять кучу шаблонов в наши репозитории узлов /запросы, и я действительно чувствую, что это должно работать.Использование одного и того же алгоритма шифрования должно привести к тем же результатам

Любое толчок или указатель будет с благодарностью

1 Ответ

0 голосов
/ 23 мая 2018

Хорошо, я все заработал, надеюсь, правильно

То, что я сделал, было:

Шифрование с crypto.createCipheriv('aes-256-cbc', new Buffer(config.AES_KEY), iv) в узле, encrypt_iv в pgsql и сохранение как hex вдБ и расшифровывая с помощью crypto.createDecipheriv / decrypt_iv в text / utf8

Я не знаю, какую часть я пропустил, но между указанием aes256 с использованием методов ivи переключение жонглирования в шестнадцатеричном / текстовом виде, которое кажется работающим.

?

...