求助:将PyCrypto RSA加密字符串存入MySQL varchar(256)列
解决RSA加密结果存入MySQL varchar列的问题
我来帮你搞定这个加密数据存库的问题,核心矛盾其实是RSA加密输出的二进制字节流和MySQL varchar列的字符串类型不兼容,还可能存在长度超限的问题,一步步来解决:
问题根源拆解
- 类型不匹配:
public_key.encrypt(username, 32)[0]返回的是bytes类型的加密数据,而MySQL的varchar列要求存入字符串(str类型),直接插入要么触发类型错误,要么存入后出现乱码/不可读的内容。 - 长度超限:如果你的RSA密钥是常用的2048位,加密后的字节长度是256字节,转成可存字符串的编码后长度会超过
varchar(256)的上限,导致数据被截断。
具体解决方案
1. 把加密字节转成Base64字符串
Base64是专门用来把二进制数据编码为纯文本的格式,既能安全存入字符串类型列,又能完整还原原始加密数据。修改你的加密代码:
# coding: utf8 from InstagramAPI import InstagramAPI import mysql.connector import sys import os import base64 # 新增导入base64模块 from Crypto.PublicKey import RSA filereader = open('public_key.txt', 'r') public_key = RSA.importKey(filereader.read()) filereader.close() username = "some_user" # 先把明文转成字节(RSA加密要求输入字节) username_bytes = username.encode('utf-8') # 加密得到字节流 encrypted_username_bytes = public_key.encrypt(username_bytes, 32)[0] # 转成Base64字符串(解码为UTF-8格式的字符串) encrypted_username = base64.b64encode(encrypted_username_bytes).decode('utf-8')
2. 调整数据库列类型
Base64编码后的字符串长度会比原始字节长约1/3,2048位RSA加密后的Base64字符串长度约344,所以建议把username列从varchar(256)修改为varchar(512)或者TEXT类型,避免数据截断。执行SQL语句修改表结构:
-- 改成varchar(512) ALTER TABLE your_table_name MODIFY COLUMN username VARCHAR(512); -- 或者用TEXT类型(更稳妥,无长度限制) ALTER TABLE your_table_name MODIFY COLUMN username TEXT;
3. 完整的数据库插入示例
补充数据库连接和插入的代码,确保数据正确存入:
# 连接数据库(替换成你的实际配置) db = mysql.connector.connect( host="your_host", user="your_db_user", password="your_db_password", database="your_db_name" ) cursor = db.cursor() # 插入加密后的字符串 sql = "INSERT INTO your_table (username) VALUES (%s)" val = (encrypted_username,) cursor.execute(sql, val) db.commit() print(f"{cursor.rowcount} 条记录插入成功") # 关闭连接 cursor.close() db.close()
4. 解密时还原数据
当你需要从数据库取出并解密时,要先把Base64字符串转回字节流,再用私钥解密:
# 从数据库获取加密后的Base64字符串 encrypted_str = "从数据库查询到的加密字符串" # 转回字节流 encrypted_bytes = base64.b64decode(encrypted_str) # 用私钥解密(示例) private_key = RSA.importKey(open('private_key.txt').read()) decrypted_username = private_key.decrypt(encrypted_bytes).decode('utf-8')
内容的提问来源于stack exchange,提问作者Tim von Känel
相关产品推荐
相关产品推荐

