現在knex
、node.js サーバーをpostgres
データベースに接続するために使用pgcrypto
しており、データの一部を暗号化するために使用し始めました。データを暗号化するゲームに少し遅れているので、更新する必要があるいくつかのクエリがあり、クエリを交換するだけでなく、実際にデータベースにクエリを実行する最も効率的な方法を探しています。PGP_SYM_DECRYPT
クエリ内に直接実装しようとするknex.select()
と、ユーザーが見つからないというエラーが表示されます。ただし、knex.raw()
クエリを使用すると、それを機能させることができます。PGG_SYM_DECRYPT
クエリ内で使用する方法.select()
、またはおそらくクエリと一緒に秘密鍵を渡して、暗号化された列を自動的に復号化する方法はありますか?
ワーキングコードの例:
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`
)
);
DESIRED コードの例 (またはその他のバリアント):
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"
);
何かご意見は?