如何解密MetroPCS登录加密密码,实现Python Requests无JS环境登录?
解决MetroPCS登录中verificationValue加密问题的实操方案
针对你想用Python Requests登录MetroPCS查询套餐余额,却卡在密码加密(verificationValue字段)的问题,分享几个可行的实操步骤:
精准定位加密代码
打开浏览器开发者工具(F12),切换到Network面板并勾选「Preserve log」,手动完成一次登录操作。再切到Sources面板,全局搜索verificationValue,找到给这个字段赋值的代码段——通常就在登录按钮的点击事件或表单提交的预处理函数里。解析加密算法细节
找到加密逻辑后,重点确认加密方式:- 如果是RSA加密:JS里一般会硬编码一个公钥字符串,直接复制即可。
- 如果是AES加密:要留意密钥、初始向量(IV)、加密模式(比如CBC)和填充规则(比如PKCS7),这些参数要么硬编码在JS里,要么从页面隐藏元素或接口返回中获取。
把JS加密逻辑转成Python代码
举两个常见场景的实现示例:- RSA加密(依赖pycryptodome库)
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 import base64 # 从JS中复制的公钥内容 metro_public_key = "-----BEGIN PUBLIC KEY-----替换为实际公钥-----END PUBLIC KEY-----" plain_password = "你的明文密码" rsa_key = RSA.import_key(metro_public_key) cipher = PKCS1_v1_5.new(rsa_key) # 加密后转base64,和JS输出格式对齐 encrypted_pwd = base64.b64encode(cipher.encrypt(plain_password.encode("utf-8"))).decode("utf-8") - AES加密(依赖cryptography库)
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend import base64 # 从JS提取的密钥、IV,需转成bytes格式 key = b"替换为实际AES密钥" iv = b"替换为实际IV值" plain_password = "你的明文密码" # 实现PKCS7填充(和JS逻辑对齐) pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16) padded_pwd = pad(plain_password).encode("utf-8") cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) encryptor = cipher.encryptor() encrypted_pwd = base64.b64encode(encryptor.update(padded_pwd) + encryptor.finalize()).decode("utf-8")
- RSA加密(依赖pycryptodome库)
验证加密结果
把Python生成的encrypted_pwd和浏览器提交的verificationValue对比,确保完全一致。如果有差异,检查编码格式、填充规则是否和JS逻辑匹配——比如JS是否把密码转成了UTF-16编码,或是用了不同的base64编码方式。构造完整登录请求
最后用Requests库构造POST请求,带上加密后的verificationValue,同时提交表单必填字段(如用户名、csrf token),以及请求头里的Cookie、User-Agent、Referer等参数,确保请求和浏览器发送的完全一致。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

