我正在编写一个python方法来转储MySQL表的全部内容。但是,此表包含个人身份信息(PII)。我要求这些数据必须是GPG加密的。另外,要求是这些数据都不允许以未加密的形式写入磁盘(即使这只是一个临时文件,稍后会被删除)
通过使用subprocess.Popen()
并将mysql
可执行文件的输出直接发送到gpg
可执行文件,然后将输出管道发送到stdout,从而暂时解决了这个问题:
p1 = subprocess.Popen(
'mysql -h127.0.0.1 -Dmydbinstance -umyuser -pmyPassword -e "select * from my_table"',
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
p2 = subprocess.Popen(
"gpg --encrypt -r myemail@gmail.com",
stdin=p1.stdout,
stdout=subprocess.PIPE
)
p1.stdout.close()
print p2.communicate()[0]
它很管用,但在我看来这是一次可怕的黑客攻击。使用fork shell进程来执行此操作感觉非常错误。在
所以我想用python本机实现这一点(不使用popen()
)。我有到数据库的MySQLdb连接。并且python-gnupg
模块可以对文件流进行加密。但是如何将MySQLdb的fetchall()的输出转换为文件流呢?到目前为止,我只知道:
如何将fetchall()的输出转换为文件流,以便可以将其发送到gpg.encrypt_file()
,而无需将临时文件写入未加密的磁盘?可能有数百万行数据。因此,一次把它全部读入内存并不是一个可行的解决方案。在
您可以使用类似于}的类似于io module的对象。在
io.StringIO
或{看一下最新的source code不再有
encrypt_file
,而是使用StringIO or BytesIO depending on the Python Version}wraps the data in a binary stream因此,实际上没有什么可以阻止您直接使用
encrypt
,如果您想要更多地控制数据的加密方式,您可以实现一个虚拟文件对象,或者只将数据写入io.BytesIO
对象。在相关问题 更多 >
编程相关推荐