decrypt_id_card.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/usr/bin/env python3
  2. """
  3. 身份证号解密工具
  4. 仅供管理员在必要时使用,用于解密数据库中的身份证号
  5. 需要配置正确的AES密钥
  6. """
  7. import sys
  8. import os
  9. from dotenv import load_dotenv
  10. # 加载环境变量
  11. load_dotenv()
  12. # 添加项目路径
  13. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  14. from app.services.encryption_service import encryption_service
  15. from app.database import SessionLocal
  16. from app.models.user import User
  17. def decrypt_user_id_card(user_id: str = None, username: str = None):
  18. """
  19. 解密用户的身份证号
  20. Args:
  21. user_id: 用户ID
  22. username: 用户名(如果不提供user_id)
  23. """
  24. db = SessionLocal()
  25. try:
  26. # 查询用户
  27. if user_id:
  28. user = db.query(User).filter(User.id == user_id).first()
  29. elif username:
  30. user = db.query(User).filter(User.username == username).first()
  31. else:
  32. print("错误: 必须提供 user_id 或 username")
  33. return
  34. if not user:
  35. print("错误: 用户不存在")
  36. return
  37. if not user.id_card:
  38. print(f"用户 {user.username} 未提交身份证号")
  39. return
  40. # 解密身份证号
  41. try:
  42. decrypted_id_card = encryption_service.aes_decrypt(user.id_card)
  43. print("=" * 60)
  44. print("用户信息")
  45. print("=" * 60)
  46. print(f"用户ID: {user.id}")
  47. print(f"用户名: {user.username}")
  48. print(f"真实姓名: {user.real_name or '未填写'}")
  49. print(f"认证状态: {user.is_verified}")
  50. print(f"身份证号: {decrypted_id_card}")
  51. print("=" * 60)
  52. except Exception as e:
  53. print(f"解密失败: {str(e)}")
  54. print("可能原因:")
  55. print("1. AES密钥不正确")
  56. print("2. 数据已损坏")
  57. print("3. 这是旧数据(未加密)")
  58. finally:
  59. db.close()
  60. def list_verified_users():
  61. """列出所有已认证的用户"""
  62. db = SessionLocal()
  63. try:
  64. users = db.query(User).filter(
  65. User.is_verified == "verified"
  66. ).all()
  67. if not users:
  68. print("没有已认证的用户")
  69. return
  70. print("=" * 80)
  71. print("已认证用户列表")
  72. print("=" * 80)
  73. print(f"{'用户ID':<40} {'用户名':<15} {'真实姓名':<10} {'身份证号':<20}")
  74. print("-" * 80)
  75. for user in users:
  76. try:
  77. if user.id_card:
  78. decrypted_id_card = encryption_service.aes_decrypt(user.id_card)
  79. else:
  80. decrypted_id_card = "未填写"
  81. except:
  82. decrypted_id_card = "解密失败"
  83. print(f"{user.id:<40} {user.username:<15} {user.real_name or '未填写':<10} {decrypted_id_card:<20}")
  84. print("=" * 80)
  85. print(f"共 {len(users)} 个已认证用户")
  86. print("=" * 80)
  87. finally:
  88. db.close()
  89. def main():
  90. """主函数"""
  91. if len(sys.argv) < 2:
  92. print("=" * 60)
  93. print("身份证号解密工具")
  94. print("=" * 60)
  95. print()
  96. print("用法:")
  97. print(" 1. 按用户ID解密:")
  98. print(" python decrypt_id_card.py <user_id>")
  99. print()
  100. print(" 2. 按用户名解密:")
  101. print(" python decrypt_id_card.py --username <username>")
  102. print()
  103. print(" 3. 列出所有已认证用户:")
  104. print(" python decrypt_id_card.py --list")
  105. print()
  106. print("=" * 60)
  107. print("注意事项:")
  108. print("1. 此工具仅供管理员使用")
  109. print("2. 需要正确配置 AES_ENCRYPTION_KEY")
  110. print("3. 请妥善保管解密后的数据")
  111. print("=" * 60)
  112. return
  113. command = sys.argv[1]
  114. if command == "--list":
  115. list_verified_users()
  116. elif command == "--username":
  117. if len(sys.argv) < 3:
  118. print("错误: 请提供用户名")
  119. return
  120. decrypt_user_id_card(username=sys.argv[2])
  121. else:
  122. # 假设是user_id
  123. decrypt_user_id_card(user_id=command)
  124. if __name__ == "__main__":
  125. main()