Actualmente estoy usando knex para conectar mi servidor node.js a una base de datos de postgres y comencé a usar pgcrypto para cifrar algunos de mis datos. Llegué un poco tarde al juego con el cifrado de mis datos, por lo que tengo varias consultas que tendré que actualizar, y estoy buscando la forma más eficiente no solo de intercambiar mis consultas, sino también de consultar la base de datos. Cuando trato de implementar PGP_SYM_DECRYPT directamente dentro de la consulta knex.select() , aparece un error que dice que no se puede encontrar al usuario. Sin embargo, si uso la consulta knex.raw() , puedo hacer que funcione. ¿Hay alguna forma de usar PGG_SYM_DECRYPT dentro de la consulta .select() , o tal vez una forma de pasar la clave secreta junto con la consulta para que descifre automáticamente las columnas encriptadas?
Ejemplo de código de trabajo:
const user = await knex("n_user AS u") .where({ "u.uuid": uuid, "su.site_id": site.id }) .first() .join("site_has_user AS su", { "su.user_id": "u.id" }) .select( "u.id", "u.uuid", "u.mobile_number", "u.email", "u.first_name", "u.last_name", "u.department", // "u.note", the note is the encrypted data "u.disabled", "su.role" ) .select( knex.raw( `PGP_SYM_DECRYPT(u.note::bytea, '${process.env.SECRET_KEY}') as note` ) );Ejemplo de código DESEADO (o alguna otra variante):
const user = await knex("n_user AS u") .where({ "u.uuid": uuid, "su.site_id": site.id }) .first() .join("site_has_user AS su", { "su.user_id": "u.id" }) .select( "u.id", "u.uuid", "u.mobile_number", "u.email", "u.first_name", "u.last_name", "u.department", `PGP_SYM_DECRYPT(u.note::bytea, '${process.env.SECRET_KEY}') as note`, "u.disabled", "su.role" );¿Alguna idea?
Puede agregar un fragmento sin procesar dentro de una selección como esta:
.select( "u.id", "u.uuid", "u.mobile_number", "u.email", "u.first_name", "u.last_name", "u.department", knex.raw("PGP_SYM_DECRYPT(??::bytea, ?) as note", ['u.note', process.env.SECRET_KEY]), "u.disabled", "su.role" ); ¿En sintaxis cruda ?? es reemplazo de identificador y ? es un enlace de valor para que la clave secreta se pase al controlador de forma segura como enlace sin intentar interpolarlo directamente a la cadena SQL.