python - 直接查询 Sqlalchemy-utils EncrytedType 作为 SQL

我有一个“用户”表,其中的电子邮件是加密类型,

class AllUser(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True, index=True)
    email = db.Column(EncryptedType(db.String(200), KEY), primary_key=True, index=True)
    password = db.Column(db.Text, default=None)
    firstname = db.Column(StringEncryptedType(db.Text, KEY))
    lastname = db.Column(StringEncryptedType(db.Text, KEY))
    name = db.Column(StringEncryptedType(db.Text, KEY))

而且我需要在不更改 python 代码的情况下查询此表以进行迁移,但我在互联网上找不到任何地方如何做到这一点,我们使用 postgres db 所以我尝试了以下带有 pgcrypto 扩展名的查询,但似乎没有去工作。

SELECT decrypt(email::bytea, key::bytea, 'aes') FROM all_user WHERE id=1;
SELECT decrypt(email, key, 'aes') FROM all_user WHERE id=1;

运行上述查询会出现以下错误 decrypt error: Data not a multiple of block size。 任何帮助将不胜感激,谢谢。

最佳答案

这似乎有效,假设默认的“aes”引擎和朴素的填充(也是默认的)。诀窍是在函数中和计算 iv 时使用 key 的散列而不是 key 本身。这与 EncryptedStringType 的 decrypt 相反方法,但注意到 _update_key方法在加密和解密之前调用。

-- Substitute your key here.
\set key 'secret_key'

SELECT
    convert_from(
        decrypt_iv(
            decode(email, 'base64'),
            sha256 (:'key'), 
            substring(sha256 (:'key'), 1, 16),
            'aes/pad:none'
        ),
        'UTF8'
    ) AS plaintext
FROM
    table;

请注意,结果将用星号填充为 16 的倍数,例如 'alice@example.com***************'

关于python - 直接查询 Sqlalchemy-utils EncrytedType 作为 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72456447/

相关文章:

javascript - javascript(ASP.Net)中的计时器倒计时

javascript - 我如何构建一个用一组新按钮回复的不和谐按钮

unity3d - Unity Microgame WebGL 上传不工作(500 内部服务器)

python - SQLAlchemy 不插入默认值

python - 如何授予应用程序(而非用户本身)对文件夹和文件的权限

flutter - 如何更新 flutterfire_web_sdk_version 以及如何启用

wordpress - 如何使用 WordPress Multisite 重定向特定站点的主页

python - 根据另一个 df 中的列计算一个 df 中的行数

java - 如何使用二维指针通过 JNA 调用 C 函数?

javascript - 未捕获的类型错误 : Failed to resolve module s