You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将PyCrypto RSA加密字符串存入MySQL varchar(256)列

解决RSA加密结果存入MySQL varchar列的问题

我来帮你搞定这个加密数据存库的问题,核心矛盾其实是RSA加密输出的二进制字节流和MySQL varchar列的字符串类型不兼容,还可能存在长度超限的问题,一步步来解决:


问题根源拆解

  1. 类型不匹配:public_key.encrypt(username, 32)[0]返回的是bytes类型的加密数据,而MySQL的varchar列要求存入字符串(str类型),直接插入要么触发类型错误,要么存入后出现乱码/不可读的内容。
  2. 长度超限:如果你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:35:36