gpt4 book ai didi

MySQL 未正确存储从 PyCrypto 库生成的密文

转载 作者:行者123 更新时间:2023-11-29 05:38:44 25 4
gpt4 key购买 nike

我在 web.py 中构建应用程序,但在将加密数据存储在 MySQL 中时遇到了一些问题。

PyCrypto 创建的密码文本看起来像:'\x06\x7f\x81\xa0\xf4d\x00H\xef\xd0\x18[c\x18Z\xf8',打印时显示向上为“ôdHïÐ[cZø

但是,MySQL 将其存储为:???d H??[cZ?我按以下方式存储它:

query_string = "INSERT INTO %s (%s) VALUES (\"%s\")" % (table, column, value) 

我尝试在连接到数据库后使用“SET character_set_connection=utf8”,但结果没有任何变化。

我显然遗漏了一些非常重要的东西。有什么想法吗?

最佳答案

MySQL 正在尝试将您的字节串存储在字符列中。因为连接字符集是 UTF-8 但字节字符串不代表有效的 UTF-8 序列,所以它被破坏了。

要将原始字节正确地放入数据库中,您需要:

  1. 使该列成为 BINARY 类型(或者通常是具有二进制排序规则的字符类型),并且

  2. 使用参数化查询将数据导入数据库,而不是将它们插入到可能与非二进制 (Unicode) 内容混合的查询字符串中。

无论如何您都应该使用参数化查询,因为您现在使用的字符串插值没有转义,容易受到 SQL 注入(inject)的攻击。在 web.py 中可能看起来像:

query_string= 'INSERT INTO %s (%s) VALUES ($value)' % (table, column)
db.query(query_string, vars= {'value': value})

(假设 tablecolumn 值已知良好。)

这样做也意味着您不必担心美元符号。

另一种方法是使用普通字符串,将非 ASCII 字节编码掉。您在当前的解决方法中使用 uucode 执行此操作,但 base64 将是更常见的替代方法,在 Python (ciphertext.encode('base64')) 中更容易获得。十六进制编码 (.encode('hex')) 最常见于哈希的情况。

关于MySQL 未正确存储从 PyCrypto 库生成的密文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com