Python-AES编解码字符串及其在MySQL中的存储

2024-10-03 15:30:07 发布

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

我正在使用Pyramid1.3(Python2.7)开发一个项目,并在MySQL中存储数据。我有一个电子邮件地址表,我想加密它们以备存储。我试图在应用程序中加密它们,然后将它们解密以供查看。我不打算完全安全,但主要目的是在数据库本身受损的情况下,使数据变得足够模糊。在

我在AES中使用PyCrypto,并且一直在尝试跟踪这里的一些帖子和我发现的一些web教程。到目前为止,我发现的最接近的是this post,它似乎可以工作,至少可以加密它。我遵循这一点,并在数据库中存储类似"7hBAQrWhJRnL9YdBGJfRErGFwGi3aC6noGzYTrGwAoQ="的内容。但是解密函数会一直出错:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 1: ordinal not in range(128)

我遇到了一些关于Python的unicode演示,这有助于我更好地理解它,但我仍然得到相同的错误。在

有关于如何编码、存储在数据库中、从数据库中取出和解码源数据字符串的简单教程吗?在

数据库需要一个特定的列排序吗?字段需要是某种类型吗?到目前为止,我一直在使用默认的排序规则并将其设置为VARCHAR,假设我存储的是字符串。听起来好像我在某个地方遇到了一些编码问题,类型不兼容之类的,但我的脑子在想我需要改变什么。在

有什么更好的建议或其他我能提供的吗?我可以显示我的代码,但它基本上是上面链接的副本。。。我只是想在修改太多之前先让它生效。在

编辑: 一些样本源。。。 在MySQL中,表是 id(内景) 客户机号(int) emailaddress varchar(100)utf8mb4_general_ci(我一直在玩排序规则,我不知道它应该是什么!)在

Python:

^{pr2}$

clientemails是上表中的电子邮件列表。我在取消注释时得到错误:

#if clientemails:
#    decrypted = DecryptWithAES(cipher_for_decryption, clientemails[0].emailaddress)

我只是想破译第一个项目,只是想让它发挥作用,但这部分似乎让它适合现在。。。。在


Tags: 数据项目字符串in数据库类型编码排序
1条回答
网友
1楼 · 发布于 2024-10-03 15:30:07

PyCrypto的一般规则是加密密钥、IVs、明文、填充和密文应始终定义为二进制字符串,而不是文本。使用Unicode作为它们本身就是问题的根源。在

另一个问题是以十六进制编码的形式传递给AES.newkey和IV,因此前者是256位,后者是128位。这似乎仍然有效,但我猜您的意图是使用AES128—它有一个128位的密钥。因此,您需要将其转换为二进制,例如通过unhexlify:两个字符的字符串b'34'将映射到单字节'\x34'。静脉注射需要两倍的时间。在

因此,在代码中最好有:

from binascii import unhexlify

INTERRUPT = b'\x01'
PAD = b'\x00'
SECRET_KEY = unhexlify('a1b2c3d4e5f6g7h8a1b2c3d4e5f6g7h8')
IV = unhexlify('12345678abcdefgh'*2)

如果您需要加密文本,您可以首先对其进行编码(例如,将其编码为UTF-8),然后将其传递给您的函数EncryptWithAES()。另请参阅来自PyCrypto API的示例:

^{pr2}$

加密步骤(即密文)的结果又是一个二进制字符串。为了将其直接存储在MySQL数据库中,必须使用BINARYVARBINARY类型的列。在

相关问题 更多 >