使用Python和PostgreSQL加密

2024-06-02 10:56:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个数据库,其中包含需要加密的个人识别信息(PII)。在

在Python方面,我可以使用PyCrypto使用AES-256和变量salt对数据进行加密;这将产生Base64编码的字符串。在

在PostgreSQL端,我可以使用PgCrypto函数以相同的方式加密数据,但这会产生一个bytea值。在

在我的一生中,我无法找到一种方法来在这两种数据之间进行转换,也无法对两者进行比较,以便对加密数据进行查询。有什么建议/想法吗?在

注意:是的,我意识到我可以在数据库端进行所有的加密/解密,但我的目标是确保在应用程序和数据库之间传输的任何数据仍然不包含任何PII,因为理论上,它可能容易被截获,或者通过日志记录可见。在


Tags: 数据函数字符串信息数据库编码postgresql方式
2条回答

Imagine you have a Social Security Number field in your table. Users must be able to query for a particular SSN when needed. The SSN, obviously, needs to be encrypted. I can encrypt it from the Python side and save it to the database, but then in order for it to be searchable, I would have to use the same salt for every record so that I can incorporate the encrypted value as part of my WHERE clause, and that just leaves us vulnerable. I can encrypt/decrypt on the database side, but in that case, I'm sending the SSN in plain-text whenever I'm querying, which is also bad.

对于这类问题,通常的解决方案是存储一个部分值,该值经过散列处理,或者使用固定的盐,与随机加盐的完整值一起存储。您可以索引散列的部分值并在此基础上进行搜索。您将得到误报匹配,但仍然可以从数据库端的索引搜索中获益匪浅。您可以获取所有匹配项,并在应用程序端丢弃误报。在

查询加密数据是关于安全性和性能之间的折衷。没有神奇的答案可以让你发送一个散列值到服务器,并让它与一堆随机加盐和散列值进行比较。事实上,这正是为什么我们在哈希值中添加盐来阻止它的工作,因为这也是攻击者在使用暴力时所做的事情。在

所以。妥协。要么接受以明文形式(通过SSL)发送ssn,以便与salted&hash存储值进行比较,因为要知道,这仍然大大减少了暴露,因为不能一次转储整个ssn。或者索引一个部分值并在上面搜索。在

请注意,未隐藏发送值的另一个问题是,它们可能会出现在服务器错误日志中。即使没有log_statement = all,如果出现错误,例如查询取消或死锁中断,它们仍可能出现。将值作为查询参数发送可以减少它们在日志中出现的位置数,但远不是万无一失的。因此,如果你发送的值是明确的,你必须把你的日志作为安全关键。有趣!在

For the life of me, I can't find a way to convert between these two, or to make a comparison between the two so that I can do a query on the encrypted data. Any suggestions/ideas?

在postgres中,bytea可以通过调用内部函数encode(bytea_value, 'base64')转换为base64。它返回以base64表示的值。在

相反,base64文本可以用decode(base64_text, 'base64')转换为二进制形式,后者返回bytea。在

来源:文档中的Binary String Functions and Operators。在

相关问题 更多 >