来自加密 table 的 Psycopg2 查询
Psycopg2 query from encrypted table
我运行成问题w。使用 psycopg2
从 table 的加密列中选择。
使用
创建测试table后
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
和
从 table 查询值
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 注入攻击来说并不安全,对吗?
有谁知道如何正确执行此操作?谢谢!
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',))
我运行成问题w。使用 psycopg2
从 table 的加密列中选择。
使用
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 注入攻击来说并不安全,对吗?
有谁知道如何正确执行此操作?谢谢!
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',))