3

現在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"
  );

何かご意見は?

4

1 に答える 1