首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询Sqlalchemy-utils直接将EncrytedType作为SQL查询

查询Sqlalchemy-utils直接将EncrytedType作为SQL查询
EN

Stack Overflow用户
提问于 2022-06-01 04:27:30
回答 1查看 184关注 0票数 3

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

代码语言:javascript
复制
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扩展的查询,但是它似乎不起作用。

代码语言:javascript
复制
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。任何帮助都将不胜感激,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-06-03 12:40:13

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

代码语言:javascript
复制
-- 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***************'

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72456447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档