decrypt_id_card.py 是一个命令行工具,用于解密数据库中AES加密存储的身份证号。此工具仅供系统管理员在必要时使用。
⚠️ 重要提示:
AES_ENCRYPTION_KEY# 检查 .env 文件中是否有 AES_ENCRYPTION_KEY
cd backend
cat .env | grep AES_ENCRYPTION_KEY
# 如果没有,运行密钥生成工具
python generate_aes_key.py
cd backend
python decrypt_id_card.py [选项] [参数]
python decrypt_id_card.py
输出:
============================================================
身份证号解密工具
============================================================
用法:
1. 按用户ID解密:
python decrypt_id_card.py <user_id>
2. 按用户名解密:
python decrypt_id_card.py --username <username>
3. 列出所有已认证用户:
python decrypt_id_card.py --list
============================================================
注意事项:
1. 此工具仅供管理员使用
2. 需要正确配置 AES_ENCRYPTION_KEY
3. 请妥善保管解密后的数据
============================================================
python decrypt_id_card.py --list
输出示例:
================================================================================
已认证用户列表
================================================================================
用户ID 用户名 真实姓名 身份证号
--------------------------------------------------------------------------------
b3c34fa9-c5ff-404e-b7b8-852f4e2d1cd7 mbx 王五 110105199001011234
a1b2c3d4-e5f6-7890-abcd-ef1234567890 testuser 张三 320106198506011234
================================================================================
共 2 个已认证用户
================================================================================
python decrypt_id_card.py b3c34fa9-c5ff-404e-b7b8-852f4e2d1cd7
输出示例:
============================================================
用户信息
============================================================
用户ID: b3c34fa9-c5ff-404e-b7b8-852f4e2d1cd7
用户名: mbx
真实姓名: 王五
认证状态: verified
身份证号: 110105199001011234
============================================================
python decrypt_id_card.py --username mbx
输出示例:
============================================================
用户信息
============================================================
用户ID: b3c34fa9-c5ff-404e-b7b8-852f4e2d1cd7
用户名: mbx
真实姓名: 王五
认证状态: verified
身份证号: 110105199001011234
============================================================
在部署后验证加密是否正常工作:
# 1. 用户提交实名认证
# 2. 使用工具解密验证
python decrypt_id_card.py --username test_user
# 3. 对比用户提交的原始数据
定期审计已认证用户:
# 导出所有已认证用户信息
python decrypt_id_card.py --list > verified_users_$(date +%Y%m%d).txt
# 查看导出文件
cat verified_users_20260331.txt
用户忘记身份证号时提供支持:
# 按用户名查询
python decrypt_id_card.py --username user123
# 提供给用户(脱敏处理)
# 例如:110105********1234
迁移到新系统前导出数据:
# 导出所有数据
python decrypt_id_card.py --list > migration_data.txt
# 处理导出的数据
# 在新系统中重新加密
============================================================
用户信息
============================================================
用户ID: <UUID>
用户名: <username>
真实姓名: <real_name>
认证状态: <verified/unverified>
身份证号: <decrypted_id_card>
============================================================
================================================================================
已认证用户列表
================================================================================
用户ID 用户名 真实姓名 身份证号
--------------------------------------------------------------------------------
<user_id> <username> <name> <id_card>
...
================================================================================
共 X 个已认证用户
================================================================================
错误: 用户不存在
原因:提供的用户ID或用户名不存在
解决方案:
# 检查用户是否存在
python decrypt_id_card.py --list
用户 xxx 未提交身份证号
原因:用户未完成实名认证
解决方案:提醒用户完成实名认证
解密失败: AES解密失败: ...
可能原因:
1. AES密钥不正确
2. 数据已损坏
3. 这是旧数据(未加密)
原因:
.env 中的 AES_ENCRYPTION_KEY 不正确解决方案:
# 1. 检查密钥配置
cat backend/.env | grep AES_ENCRYPTION_KEY
# 2. 如果是旧数据,需要用户重新提交认证
# 3. 如果密钥丢失,数据无法恢复
sqlalchemy.exc.OperationalError: ...
原因:无法连接到数据库
解决方案:
# 检查数据库配置
cat backend/.env | grep DATABASE_URL
# 测试数据库连接
psql -U your_username -d your_database -c "SELECT 1;"
# 限制工具文件权限(仅所有者可执行)
chmod 700 backend/decrypt_id_card.py
# 限制密钥文件权限
chmod 600 backend/.env
建议记录所有解密操作:
# 创建审计日志
echo "$(date) - User: $(whoami) - Action: decrypt - Target: $1" >> /var/log/id_card_decrypt.log
# 查看审计日志
tail -f /var/log/id_card_decrypt.log
避免敏感信息显示在终端:
# 输出到文件
python decrypt_id_card.py --list > /tmp/secure_output.txt
# 查看后立即删除
cat /tmp/secure_output.txt
shred -u /tmp/secure_output.txt
使用后清除命令历史:
# 清除当前会话历史
history -c
# 或者使用空格前缀(不记录到历史)
python decrypt_id_card.py --username test
创建一个脚本进行批量导出并脱敏:
#!/bin/bash
# export_masked.sh
python decrypt_id_card.py --list | while read line; do
# 脱敏处理:只显示前6位和后4位
echo "$line" | sed 's/\([0-9]\{6\}\)[0-9]\{8\}\([0-9X]\{4\}\)/\1********\2/g'
done
# 导出为CSV格式
python decrypt_id_card.py --list | \
awk 'NR>3 && NF>0 {print $1","$2","$3","$4}' > users.csv
# 导出为JSON格式(需要修改工具)
# 或使用 jq 处理
如果需要添加新功能,修改 decrypt_id_card.py:
# 示例:添加导出为JSON功能
def export_to_json():
"""导出为JSON格式"""
import json
db = SessionLocal()
try:
users = db.query(User).filter(
User.is_verified == "verified"
).all()
result = []
for user in users:
decrypted_id_card = encryption_service.aes_decrypt(user.id_card)
result.append({
"user_id": user.id,
"username": user.username,
"real_name": user.real_name,
"id_card": decrypted_id_card
})
print(json.dumps(result, ensure_ascii=False, indent=2))
finally:
db.close()
# 创建测试用户
# 提交测试认证
# 运行解密工具验证
python decrypt_id_card.py --username test_user
A: 可以,但必须:
A:
A:
A:
| 版本 | 日期 | 更新内容 |
|---|---|---|
| v1.0 | 2026-03-31 | 初始版本 |
使用此工具即表示您同意:
未经授权使用此工具可能违反法律!