Проблема : Мы должны зашифровать определенный столбец в определенной таблице (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 действительно хотят избежать необходимости добавлять кучу шаблонов в наши репозитории узлов /запросы, и я действительно чувствую, что это должно работать.Использование одного и того же алгоритма шифрования должно привести к тем же результатам
Любое толчок или указатель будет с благодарностью