如何将明文Facebook密码加密为#PWD_BROWSER格式后再发送?
如何将明文Facebook密码加密为#PWD_BROWSER格式后发送?
Facebook会在发送登录请求到服务器前,对明文密码进行加密。比如使用测试凭证登录时,POST请求体如下:
email: test12345@gmail.com login_source: comet_headerless_login encpass: #PWD_BROWSER:5:1683905042:AcZQAJrk/vksWHThqOkelJMFc6UCV35HSZY5kIlN8qfRPxxMAtKIaV0h+e5ACcb8PXPqTx3m5D+lOp+ylB+CY6WMmsyIwrx5sxBvurrCtQX3Re+aGM/VfITIVk9HnQMkvlx9ZMJJjF2zW6Ym5g==
上述内容中,明文密码test12345被加密成了encpass对应的字符串
我已经了解到#PWD_BROWSER和后面的5是固定值,1683905042是时间戳,但无法解析后续的加密部分。我从Facebook页面源码中找到了密码加密的前置函数,但仍不清楚具体实现:
_encryptBeforeSending: function(a) { a = a.bind(h); var d = h.loginFormParams && h.loginFormParams.pubKey; if ((window.crypto || window.msCrypto) && d) { var e = c("DOM").scry(h.loginForm, 'input[id="pass"]')[0], f = b("FBBrowserPasswordEncryption"), g = Math.floor(Date.now() / 1e3).toString(); c("promiseDone")(f.encryptPassword(d.keyId, d.publicKey, e.value, g), function(b) { b = c("DOM").create("input", { type: "hidden", name: "encpass", value: b }); h.loginForm.appendChild(b); e.disabled = !0; a() }, function(c) { var d = "#PWD_BROWSER", e = 5, f = b("LoginServicePasswordEncryptDecryptEventTypedLogger"); new f().setError("BrowserEncryptionFailureInLoginFormControllerWWW").setGrowthFlow("Bluebar/main login WWW").setErrorMessage(c.message).setPasswordTag(d).setPasswordEncryptionVersion(e).setPasswordTimestamp(g).logVital(); a() }) } else a() },
实现步骤
1. 获取登录页面的公钥参数
Facebook登录页面加载时,会在页面上下文注入包含公钥的loginFormParams对象,其中pubKey字段包含keyId和publicKey两个核心值。你可以通过浏览器控制台执行对应变量(比如源码中的h.loginFormParams.pubKey)获取,或者从页面初始化的脚本数据中提取。
2. 模拟加密逻辑
从源码可知,加密依赖FBBrowserPasswordEncryption的encryptPassword方法,底层实际是基于**公钥加密算法(大概率是RSA)**结合时间戳处理密码,具体流程可以用Web Crypto API模拟:
- 将获取到的公钥转换为Web Crypto支持的
CryptoKey对象(注意公钥格式,通常是PEM或JWK) - 拼接明文密码和时间戳(格式为
{明文密码}{时间戳},比如test123451683905042) - 使用RSA加密算法(推荐RSA-OAEP,符合现代安全标准)加密拼接后的字符串
- 将加密后的二进制数据转换为Base64编码字符串
- 按照固定格式拼接成encpass值:
#PWD_BROWSER:5:{时间戳}:{Base64加密内容}
3. 构造并发送POST请求
将email、login_source、生成的encpass等参数放入POST请求体,发送到Facebook的登录接口即可。
注意事项
- Facebook的公钥会定期更新,每次登录都需要重新获取当前页面的有效公钥
- 加密细节可能会随版本调整,建议通过调试浏览器中
FBBrowserPasswordEncryption的实际实现来验证逻辑 - 请严格遵守Facebook的服务条款,不要用于违规操作
内容的提问来源于stack exchange,提问作者vidgusting
相关产品推荐
相关产品推荐

