psycopg2从加密表查询

k4aesqcs  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(460)

我遇到了一个问题。使用从表中选择加密列 psycopg2 . 在使用

  1. create table users (
  2. id BIGSERIAL NOT NULL PRIMARY KEY,
  3. first_name VARCHAR(100) NOT NULL,
  4. last_name VARCHAR(100) NOT NULL,
  5. secret_val_1 BYTEA,
  6. secret_val_2 BYTEA
  7. );

我可以在里面插入加密值。
现在我尝试使用 psycopg2 使用:

  1. cur.execute("""
  2. SELECT PGP_SYM_DECRYPT(%s::BYTEA, 'compress-algo=1, cipher-algo=aes256')
  3. FROM users;
  4. """,
  5. ('secret_val_1',))

现在出现了一个错误:

  1. ExternalRoutineInvocationException: Wrong key or corrupt data

有趣的是,当这样传递值时,它是有效的:

  1. def query_users_decrypt(col):
  2. cur.execute("""
  3. SELECT PGP_SYM_DECRYPT({}::BYTEA, 'compress-algo=1, cipher-
  4. algo=aes256') FROM users;
  5. """.format(col),
  6. (col,))

但是这对于sql注入攻击是不安全的,对吗?
有人知道怎么做吗?谢谢!

mctunoxg

mctunoxg1#

这个 format() 因为当你通过考试 secret_val_1 在中,它最终看起来像:

  1. SELECT PGP_SYM_DECRYPT(secret_val_1::BYTEA, 'compress-algo=1, cipher-algo=aes256')
  2. FROM users;

你要找的只是一个简单的问题:

  1. select pgp_sym_decrypt(secret_val_1, 'compress-algo=1, cipher-algo=aes256')
  2. from users;

参数绑定适用于您希望传入查询所使用的值的情况。这个 secret_val_1 不是值,因为它是列的名称。
将参数绑定用于以下内容:

  1. cur.execute("""select pgp_sym_decrypt(secret_val_1, 'compress-algo=1, cipher-algo=aes256'
  2. from users
  3. where username = %s""", ('joeuser',))

相关问题