create_rsa_key_table.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. # -*- coding: utf-8 -*-
  2. """
  3. 996cq 库新增 login_rsa_keys 表:存储 996盒子登录页 RSA 公钥
  4. - 单行语义(scope='login_byPwd'),is_active 标记当前生效
  5. - 保留历史版本行(is_active=0),便于回溯轮换记录
  6. """
  7. import pymysql
  8. CONN = dict(host="47.99.164.66", port=3306, user="root",
  9. password="hn02le.34lkdLKD", database="996cq",
  10. charset="utf8mb4", autocommit=True, connect_timeout=10)
  11. DDL = """
  12. CREATE TABLE IF NOT EXISTS login_rsa_keys (
  13. id INT PRIMARY KEY AUTO_INCREMENT,
  14. scope VARCHAR(64) NOT NULL COMMENT '用途: login_byPwd',
  15. public_key VARCHAR(512) NOT NULL COMMENT 'X.509 SPKI base64 (216 chars)',
  16. key_n_hex VARCHAR(256) NOT NULL COMMENT '模数 hex,便于比对/排查',
  17. source VARCHAR(32) NOT NULL DEFAULT 'bootstrap' COMMENT '来源: bootstrap/login_page_hook',
  18. is_active TINYINT(1) NOT NULL DEFAULT 1,
  19. verified_at TIMESTAMP NULL COMMENT '最近一次用该 key 成功登录的时间',
  20. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  21. UNIQUE KEY uk_scope_active (scope, is_active, public_key(216)),
  22. INDEX idx_scope (scope, is_active)
  23. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='996盒子登录 RSA 公钥(自动轮换)'
  24. """
  25. # 2026-09-17 从登录页 runtime hook 导出的当前公钥
  26. CURRENT_KEY = ("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAjCQvqNPnOZm6GVDqeOb5S2pJtbN3FMZ8"
  27. "vddW3B2f3jB0mf7vd1B+yjjfex2A5XVxr4YwAY/w4d1/m3v3Bn/qgAnLMKnpjeEwxQU3cU81eXAam"
  28. "4fMB+nlmC291quIuC0qFFL8YgT2bDjARsMRYbmKd6LTc58sKYeJD2MvkkOdKwIDAQAB")
  29. from Crypto.PublicKey import RSA
  30. import base64
  31. N_HEX = format(RSA.import_key(base64.b64decode(CURRENT_KEY)).n, "x")
  32. conn = pymysql.connect(**CONN)
  33. try:
  34. with conn.cursor() as cur:
  35. cur.execute(DDL)
  36. print("[+] table login_rsa_keys created (IF NOT EXISTS)")
  37. # 同 scope 旧 active 行全部下线
  38. cur.execute("UPDATE login_rsa_keys SET is_active=0 WHERE scope=%s AND is_active=1", ("login_byPwd",))
  39. cur.execute(
  40. "INSERT INTO login_rsa_keys (scope, public_key, key_n_hex, source, is_active) "
  41. "VALUES (%s, %s, %s, %s, 1)", ("login_byPwd", CURRENT_KEY, N_HEX, "bootstrap"))
  42. print("[+] active key inserted:", CURRENT_KEY[:50] + "...")
  43. cur.execute("SELECT id, scope, LEFT(public_key,40), is_active, source, created_at FROM login_rsa_keys")
  44. for row in cur.fetchall():
  45. print(" ", row)
  46. finally:
  47. conn.close()