【问题标题】:Psycopg2 query from encrypted table来自加密表的 Psycopg2 查询
【发布时间】:2020-07-16 20:32:51
【问题描述】:

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

创建了一个测试表之后
create table users (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    secret_val_1 BYTEA,
    secret_val_2 BYTEA
);

我能够在其中插入加密值。
现在我正在尝试使用psycopg2 查询表中的值:

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

现在这会引发错误:

ExternalRoutineInvocationException: Wrong key or corrupt data

有趣的是,当像这样传递值时,它可以工作:

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

但这对于 sql-injection 攻击并不安全,对吧?
有谁知道如何正确地做到这一点?谢谢!

【问题讨论】:

  • 您想在查询中完成什么?您发送的'secret_val_1' 是什么? format() 版本不应该工作,因为你需要单引号包围它。如果你的秘密值看起来像'\xc30d040...',那么在它前面放一个r 来生成一个原始字符串(例如r'\xc30d040...'。查询将返回等于users 中的行数的行数表,每个表都有一列,其中包含您传入的任何内容的解密形式。
  • 您好,感谢您的 cmets。我只是想从表中查询并解密列secret_val_1。对于所有条目。奇怪的是 format() 方法对我有用,但我知道它不安全。不幸的是,使用r'secret_val_1' 选项给了我同样的错误。我不确定我在这里错过了什么......
  • 哇!我明白为什么format() 现在可以工作了。您将文字 secret_val_1 传递给格式,以便替换列名。我会给你一个答案。
  • 抱歉,可能不清楚,因为在我的代码中,我将查询包装在一个函数中。我更新了它,这对我来说是这样的。

标签: python sql postgresql psycopg2 pgcrypto


【解决方案1】:

format() 有效,因为当您传入 secret_val_1 时,它最终看起来像:

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

您正在寻找的只是直接查询:

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

参数绑定适用于您想要传入查询使用的值时。 secret_val_1 不是值,因为它是列的名称。

对这样的事情使用参数绑定:

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

【讨论】:

  • 这正是我想要的,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多